【Kotlin/Android】BroadcastReceiverの使い方!登録と解放、発火方法

この記事からわかること

  • Android Studio/KotlinBroadcastReceiver実装方法
  • 静的登録動的な登録の違い
  • registerReceiverunregisterReceiversendBroadcastメソッドの使い方
  • IntentFilter役割

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

BroadcastReceiverとは?

公式リファレンス:BroadcastReceiver

AndroidのBroadcastReceiverブロードキャストインテントを受信して​​処理を実行する基本クラスです。これを使用することでイベントやシステム通知などを受信し、特定の処理やアクティビティやサービスの起動、異なるアプリ間のイベント送受信などを行うことができます。

BroadcastReceiverを継承したReceiverクラスを作成して、活用しオーバーロードしたonReceiveメソッド内でブロードキャストを受信した際に実行される処理を記述します。

class ReceivedActivity : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
      // ブロードキャストを受信した際に実行される処理を記述する
    }
}

プロジェクト内で使用するためにはBroadcastReceiverを登録する必要があります。これは静的な登録と動的な登録のどちらかを行う必要があります。

静的な登録方法:AndroidManifest.xmlに追加する

静的な登録はアプリがインストールされるときにブロードキャストレシーバーが登録され、アプリが実行されていなくてもブロードキャストを受信できます。必要のない場合でも強制的に登録されるので導入する際は無駄なリソースを消費しないように注意する必要があります。

静的に登録する方法は「AndroidManifest.xml(マニフェストファイル)」にブロードキャストを受け取るクラスを以下のように宣言します。これでブロードキャストを受信できるようになります。


<application
    <!-- 省略 -->
    <activity
      <!-- 省略 -->
    </activity>

    <!-- 追加 -->
    <receiver android:name=".ReceivedActivity"
        android:process=":remote" />
</application>

動的な登録方法:Context.registerReceiverを使用する

動的な登録はアプリが実行中にブロードキャストレシーバーが登録し、アプリが終了した場合はブロードキャストが失われる可能性があります。こちらは必要な時に登録し、不要になったら削除することができるので柔軟にブロードキャスト機能を使用することができ、セキュリティ的にも安全になります。

動的に登録する方法はContext.registerReceiverメソッドを使用します。引数には対象のReceiverクラスとIntentFilterを渡します。


public Intent registerReceiver(@Nullable  BroadcastReceiver receiver, IntentFilter filter) {
    throw new RuntimeException("Stub!");
}

IntentFilterの役割はブロードキャストされてくるIntentのフィルタリングです。つまりIntentFilterによって指定された条件に一致するブロードキャストのみがレシーバーによって処理されます。

val filter = IntentFilter().apply {
    // アクションの名前
    addAction("com.example.ACTION_NAME")
    // デフォルトカテゴリ
    addCategory(Intent.CATEGORY_DEFAULT) 
    
    // データスキーム
    addDataScheme("http") // HTTPスキーム
    addDataScheme("https") // HTTPSスキーム
    
    // MIMEタイプの追加
    addDataType("text/plain") // テキスト/プレイン
    
    // パッケージ名の指定
    addPackage("com.example.myapp")
}
registerReceiver(ReceivedActivity(), filter)

レシーバーを解放する

不要になったレシーバーはunregisterReceiverメソッドを使用して解放します。onDestroyなどのライフサイクルに混ぜておくと解放し忘れを防ぐことができます。

override fun onDestroy() {
    super.onDestroy()
    unregisterReceiver(receiver)
}

ブロードキャストを発火して受信する

実際にブロードキャストを発火するにはsendBroadcastメソッドを使用します。引数にはIntentを渡します。

おすすめ記事:【Kotlin/Android Studio】Intentとは?Activity間のデータの受け渡し

val intent = Intent().apply {
    action = "com.example.ACTION_NAME"   // アクション名を指定
    putExtra(Intent.EXTRA_TEXT, "Hello") // 例:エクストラデータを渡す
}
sendBroadcast(intent)

これで指定したアクション名を受信するレシーバークラスに通知が届き処理が実行されます。

全体のコード


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val filter = IntentFilter().apply {
            addAction("com.example.ACTION_NAME")
        }
        registerReceiver(ReceivedActivity(), filter)

        val intent = Intent().apply {
            action = "com.example.ACTION_NAME"
            putExtra(Intent.EXTRA_TEXT, "Hello")
        }
        sendBroadcast(intent)
    }
    
    override fun onDestroy() {
        super.onDestroy()
        unregisterReceiver(receiver)
    }
}

class ReceivedActivity : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val action = intent.action
        val extras = intent.extras
        Log.d("ReceivedBroadcast", "アクション: $action")
        extras?.let { bundle ->
            for (key in bundle.keySet()) {
                val value = bundle.get(key)
                Log.d("ReceivedBroadcast", "Key: $key, Value: $value")
            }
        }
    }
}

端末の電源ON/OFFを検知する方法

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index