【初心者向け】Androidブロードキャストレシーバーの基礎と実装入門
安定したインターネット接続が不可欠なアプリケーションを開発しているとしましょう。ネットワーク接続の状態が変化した際に、そのことをアプリへ通知させたい——そんなとき、どうすればよいのでしょうか?一つの解決策として、常時インターネット接続を監視し続けるサービスを実装する方法が考えられます。しかし、この実装にはさまざまな問題があるため、検討する価値すらありません。この問題に対する正しい答えがブロードキャストレシーバー(Broadcast Receiver)です。ブロードキャストレシーバーは、指定したイベントの変化を常にリッスンしてくれます。
ブロードキャストレシーバーは、アプリケーションの状態に関わらず、常にブロードキャストの通知を受け取ります。アプリが現在フォアグラウンドで動作しているのか、バックグラウンドにあるのか、あるいはまったく起動していないのかは一切関係ありません。
背景知識
ブロードキャストレシーバーとは、Androidアプリケーションにおいて、以下のようなさまざまな発信元からのブロードキャストメッセージ(イベント)を受信するコンポーネントです。
- 他のアプリケーションから
- システム(OS)自体から
- 自分のアプリケーション内部から
つまり、あらかじめプログラムしておいた特定のアクション(=ブロードキャスト)が発生したときに呼び出される仕組みです。
ブロードキャストとは、端的に言えばIntentオブジェクトに包まれたメッセージのことです。ブロードキャストには「暗黙的」と「明示的」の2種類があります。
- 暗黙的ブロードキャスト(Implicit Broadcast):特定のアプリケーションをターゲットとしないため、自分のアプリ専用ではありません。受信するにはIntentFilterを使用し、マニフェストに宣言する必要があります。これは、Android OSがマニフェスト内で宣言されたすべてのインテントフィルターを走査し、一致するものがあるかを確認する仕組みになっているためです。この挙動により、暗黙的ブロードキャストにはターゲット属性が存在しません。例として、SMS着信時のアクションが挙げられます。
- 明示的ブロードキャスト(Explicit Broadcast):事前に既知のコンポーネントに対して、自分のアプリケーション向けに明確にターゲット指定されたブロードキャストです。アプリのパッケージ名またはコンポーネントクラス名を含むターゲット属性によって実現されます。
レシーバーを宣言する2つの方法
- AndroidManifest.xmlファイル内で<receiver>タグを使って宣言する(静的宣言)
<receiver android:name=".YourBrodcastReceiverClass" android:exported="true">
<intent-filter>
<!-- リッスンしたいアクションを記述します。以下は例 -->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>上記で宣言したブロードキャストレシーバーには、exported="true"というプロパティが設定されていることに注目してください。この属性は、アプリケーションの外部スコープからのブロードキャストも受信できることを示しています。
2. registerReceiverを使ってインスタンスを動的に登録する(コンテキスト登録)
public abstract Intent registerReceiver (BroadcastReceiver receiver,
IntentFilter filter);実装方法
独自のブロードキャストレシーバーを作成するには、まずBroadcastReceiver親クラスを継承し、必須メソッドであるonReceiveをオーバーライドします。
public void onReceive(Context context, Intent intent) {
//ここにロジックを実装します
}これらをまとめると、次のようになります。
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
StringBuilder sb = new StringBuilder();
sb.append("Action: " + intent.getAction() + "\n");
sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
String log = sb.toString();
Toast.makeText(context, log, Toast.LENGTH_LONG).show();
}
}⚠️ onReceiveメソッドはメインスレッド上で実行されるため、処理は短時間で完了させる必要があります。
長時間の処理を実行すると、メソッドが返った後にシステムがプロセスを強制終了する可能性があります。これを回避するには、goAsyncの使用やジョブのスケジューリングを検討してください。ジョブスケジューリングについては、本記事の下部で詳しく解説します。
動的登録の実装例
コンテキストにレシーバーを登録するには、まずブロードキャストレシーバーのインスタンスを生成します。
BroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();次に、任意のコンテキストに対して登録を行います。
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
this.registerReceiver(myBroadcastReceiver, filter);ブロードキャストレシーバーが不要になったら、登録解除を忘れないようにしてください。
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(myBroadcastReceiver);
}イベントをブロードキャストする
アプリケーションからメッセージをブロードキャストする目的は、アプリ内部で発生したイベントに対して応答できるようにすることです。コードのある部分でユーザーが特定の操作を行い、それをきっかけに、別の場所にある別のロジックを実行したい——そんなシナリオを想像してみてください。
ブロードキャストを送信する方法は3つあります。
- sendOrderedBroadcastメソッド:一度に1つのレシーバーのみにブロードキャストを送信することを保証します。各レシーバーは、後続のレシーバーへデータを引き渡すことも、後続のレシーバーへの伝播を停止することもできます。
- sendBroadcastメソッド:上記のメソッドと似ていますが、異なる点が1つあります。すべてのブロードキャストレシーバーがメッセージを受信し、互いに依存しません。
- LocalBroadcastManager.sendBroadcastメソッド:自分のアプリケーション内で定義されたレシーバーにのみブロードキャストを送信し、アプリのスコープ外には及びません。

注意点と落とし穴
- 機密性の高いデータを暗黙的ブロードキャストで送信してはいけません。リッスンしているすべてのアプリケーションがそのデータを受信できてしまうためです。これを防ぐには、パッケージを指定するか、ブロードキャストにパーミッションを付与します。
- 受信したブロードキャストからアクティビティを直接起動しないでください。ユーザー体験を損なう恐れがあります。代わりに通知の表示を選びましょう。
以下の項目は、Android OSのバージョンごと(7.0以降)におけるブロードキャストレシーバー関連の変更点をまとめたものです。バージョンごとに一定の制限が設けられ、動作も変更されています。ブロードキャストレシーバーの利用を検討する際は、これらの制限を必ず念頭に置いてください。
- 7.0以降(APIレベル24) — ACTION_NEW_PICTUREとACTION_NEW_VIDEOの2つのシステムブロードキャストが無効化されました(ただしAndroid Oでは、登録済みレシーバー向けに復活しています)。
- 8.0以降(APIレベル26) — ほとんどの暗黙的ブロードキャストは、マニフェストへの静的宣言ではなく、動的な登録が必要になりました。ホワイトリストに登録されたブロードキャストは公式ドキュメントで確認できます。
- 9.0以降(APIレベル28) — Wi-FiシステムブロードキャストおよびNETWORK_STATE_CHANGED_ACTIONで受け取れる情報が減少しました。
特に意識すべきはAndroid O(8.0)での変更です。これらの変更が行われた理由は、パフォーマンス低下、バッテリー消耗、そしてユーザー体験の悪化につながったからです。多くのアプリケーション(現在実行中でないものさえ含む)がシステム全体の変化をリッスンしており、その変化が発生した瞬間に大混乱が起きていました。登録されたすべてのアプリが、ブロードキャストに対応すべき処理があるかどうかを確認するために一斉に起動する様子を想像してみてください。Wi-Fiの状態のように頻繁に変化するものまで考慮すれば、なぜこれらの変更が必要だったのか理解できるでしょう。
ブロードキャストレシーバーの代替手段
こうした制約の中で開発を進めやすくするために、ブロードキャストレシーバーが使えない場合に利用できる他のコンポーネントを紹介します。それぞれ責務とユースケースが異なるため、自分のニーズに合うものを見極めてください。
- LocalBroadcastManager — 前述のとおり、アプリケーション内部のブロードキャストにのみ有効です。
- ジョブのスケジューリング(JobScheduler) — ジョブは受信したシグナルやトリガーに応じて実行できるため、リッスンしていたブロードキャストをジョブで置き換えられる場合があります。さらに、JobSchedulerはジョブの完了を保証しますが、実行タイミングはさまざまなシステム要因(時間や条件)を考慮して決定されます。ジョブを作成する際はonStartJobメソッドをオーバーライドします。このメソッドはメインスレッドで実行されるため、限られた時間内に処理を完了させる必要があります。複雑なロジックが必要な場合は、バックグラウンドタスクの開始を検討してください。また、このメソッドの戻り値はboolean型で、trueはまだ処理が継続中であること、falseはジョブが完了したことを意味します。
ブロードキャストレシーバーの魅力を実際に体験してみたい方は、筆者が公開している以下のサンプルリポジトリを参照してください。
- カスタムブロードキャスト(マニフェストでの宣言あり)
- ブロードキャストの登録(マニフェストでの宣言なし)
- LocalBroadcastManager
以上、ブロードキャストの解説でした。
-
初心者向けMicrosoft PowerPointチュートリアル:スライド作成の基本操作を徹底解説
本記事は、Microsoft PowerPointを初めて使う方向けのチュートリアルです。PowerPointの起動方法からプレゼンテーションの作成手順まで、ステップバイステップでわかりやすく解説します。新しいスライドの追加、ヘッダーとフッターの設定、テーマの選択、切り替え効果やアニメーションの活用方法など、プレゼンテーションを魅力的に仕上げるための基本操作とコツをすべて網羅しています。それでは始めましょう。 初心者向けPowerPointチュートリアル PowerPointはMicrosoft Officeスイートに含まれるアプリケーションの一つで、効果的なプレゼンテーション資料やスライドシ
-
初心者必見!MacBook Proを使いこなすための10の便利ワザ
MacBook Proは非常にパワフルなノートパソコンで、使いこなせば作業効率を何倍にも高めることができます。しかし、特にWindows環境に慣れている方にとっては、少しとっつきにくい部分もあるかもしれません。この記事では、洗練されたアルミニウムボディの最新マシンに早く慣れるための、実用的な10のコツをご紹介します。 注意:本記事はmacOS High Sierraが動作する2018年モデルを使用して執筆しています。古いMacBook Proモデルや旧バージョンのmacOSをお使いの場合は、一部の機能が利用できない場合がありますのでご了承ください。 また、YouTubeチャンネルでは本記事の