【Kotlin/Android】BroadcastReceiverの使い方!登録と解放、発火方法
この記事からわかること
- Android Studio/KotlinでBroadcastReceiverの実装方法
- 静的な登録と動的な登録の違い
- registerReceiverやunregisterReceiver、sendBroadcastメソッドの使い方
- IntentFilterの役割
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
BroadcastReceiverとは?
AndroidのBroadcastReceiver
はブロードキャストインテントを受信して処理を実行する基本クラスです。これを使用することでイベントやシステム通知などを受信し、特定の処理やアクティビティやサービスの起動、異なるアプリ間のイベント送受信などを行うことができます。
BroadcastReceiver
を継承したReceiverクラスを作成して、活用しオーバーロードしたonReceive
メソッド内でブロードキャストを受信した際に実行される処理を記述します。
class ReceivedActivity : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// ブロードキャストを受信した際に実行される処理を記述する
}
}
プロジェクト内で使用するためにはBroadcastReceiverを登録する必要があります。これは静的な登録と動的な登録のどちらかを行う必要があります。
- 静的な登録方法:AndroidManifest.xmlに追加する
- 動的な登録方法:Context.registerReceiverを使用する
静的な登録方法: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を検知する方法
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。