【Android】ブロードキャストの登録、送信、解除方法 【kotlin】

  • ブロードキャストって何?
  • 具体的な使い方は?

最近、ブロードキャストを案件で使うことになったためまとめました。

サンプルも作成しました。Gitでソースコードが見れます。

サンプルコードはこちら。

実際に完成したアプリを起動するとどうなるかは以下の動画を見てください。

 

ブロードキャストとは?

同じメッセージを複数の受信者に同時に転送するのが、ブロードキャストです。
ブロードキャストには、二通りあります。

システムブロードキャスト

デバイスの充電や、機内モードのON/OFFなどAndroidシステムがブロードキャストを送信するパターン。

どういったシステムブロードキャストが存在するかについては、こちらのサイトがよくまとまっていたので気になる方は参考に。
「壁紙が変更されたー」なんてのもあるようです

IntentのBroadcast Actionの一覧表を作ってみたよ

カスタムブロードキャスト

ブロードキャストを送信タイミングをカスタマイズするパータン

アプリ内の好きなタイミングで送信させることができます。
例えば、

  • アプリ内のボタンが押されたとき
  • アプリ内のデータが変わったとき
  • アプリ内のある画面が表示されたとき

などなど。好きなタイミングで送信させることができます。

ブロードキャストの受信登録

登録方法には2種類あります

1. マニフェストにブロードキャストのレシーバー(受信)を宣言する方法。【暗黙的ブロードキャスト】

独自に作成したBroadcastReceiverクラスをAndroidManifest.xmlにレシーバー情報を宣言する方法です。
明示的にどの画面(Activity)で受信するかなどを指定しないため、暗黙的ブロードキャストと呼ばれるようです。

  • アプリのインストール時にレシーバーを登録する
  • アプリが実行されていなくても登録されていれば受信可能

などのメリットがあります。

ただし、Android 8以降から厳しくなり受信可能なブロードキャストがかなり制限されるようになりましたorz

なので、将来制限される可能性も考慮すると基本 暗黙的ブロードキャストは使えないと考えた方が無難です。
どーーーーーしても使いたい!って場合は、暗黙的なブロードキャストの例外という公式サイトのURLに制限外のブロードキャスト一覧がありますので、参考にしながら自分がアプリで実現したいことが可能か見てみるのもありです。

なぜ暗黙的ブロードキャストが制限されるようになったのか?

理由は、明快。パフォーマンスの改善のためです。
電池が持つようにーとかですね。

ブロードキャストは、ブロードキャストレシバーが登録されている全てのアプリが受信できます。
つまり、レシーバーに登録されているアプリの数が多くなればなるほどAndroid端末の負担が大きくなります。
そのため、不要なレシーバーの数を減らして少しでも負担を軽減する。。。

という流れのようです。

2. 明示的にどの画面で受信するのか記載する【明示的ブロードキャスト】

暗黙的ブロードキャストと逆で、どの画面で受信するのかソースコード上で受信するよう設定する方法。

登録の流れとしては、

  1. 独自に作成したBroadcastReceiverクラスのインスタンス作成
  2. レシーバーの登録

となります。

レシーバーの登録方法

2種類あります。

  • contextを使用した受信登録方法
  • LocalBroadcastManagerを使用した受信登録方法

contextは、Androidシステムや他のアプリからブロードキャストを受信する場合はこちらを使います。

LocalBroadcastManagerは、アプリ内でのみブロードキャストを受信する場合に使います。あまり使い道ないように思えますが、使いこなせると便利です。
例えば、裏で隠れている別の画面と同期させたりとか。。。(自分が関わってる案件でお世話になりました)
システムの負担も少ないため、アプリ内のみで使う場合はこちら推奨です。

(例)ソースコード

LocalBroadcastManagerを使用した例です。

MEMO

明示的ブロードキャストレシーバの登録ですが、登録した画面が破棄されたタイミングで受信もできなくなるため注意が必要です。

あくまで、登録したブロードキャストレシバーが有効な限り受信できるということを覚えておきましょう。

ブロードキャストの送信

送信内容は、Intentに詰めてsendBroadcastメソッドに渡してあげればOKです。
送信は、ボタンが押されたときなど任意のタイミングで送信してあげてください。

ブロードキャストの解除

明示的ブロードキャストの場合に必要です。

unregisterReceiverで解除できます。

ローカルブロードキャストを解除する場合

localBroadcastReciver.unregisterReceiver(broadcastReciver)
ノーマルブロードキャストを解除する場合

unregisterReceiver(broadcastReciver)
MEMO

解除するタイミングだけ注意!

onCreateで登録した場合は、onDestroyで解除。

onResumeで登録した場合は、onPauseで解除。

onSaveInstanceStateで登録、解除は避けましょう!

まとめ

  • 暗黙的ブロードキャストと明示的ブロードキャストがある
  • 暗黙的ブロードキャストの方が便利だけど、Android8から制限が厳しくなった
  • 独自のBroadcastクラスの作成が必要
  • Intentに送信したい内容を詰めて、ブロードキャストを送信する

ブロードキャストは、極めると痒いところまで届く便利な機能である反面、制限やAndroidシステムへの負担など考慮すべきことが増えていきます。
是非、マスターしてみてくださいー

でわー

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です