Android の 4 つの主要コンポーネントのブロードキャスト
1. はじめに
Android アプリケーション開発では、ブロードキャスト コンポーネントは重要なテクノロジであり、さまざまなタスクやシナリオで広く使用されています。システムレベルのブロードキャストを送信する場合でも、アプリケーション内のコンポーネント間の通信を実装する場合でも、ブロードキャスト コンポーネントの動作原理と使用法を理解し、習得することは、すべての Android 開発者にとって重要です。この記事は、Android ブロードキャスト コンポーネントを深く理解し、実用的なヒントや提案を提供することを目的としています。
質問しながら勉強する
放送とは何ですか?
ブロードキャストにはどのような機能が含まれていますか?
ブロードキャストはどのように送受信されるのでしょうか?
放送の登録方法と登録方法は何ですか?
どのようなシステム放送がありますか?
静的登録と動的登録の違いは何ですか?
Android でブロードキャスト レシーバーをすばやく作成するにはどうすればよいですか?
カスタムブロードキャストを送信するにはどうすればよいですか?
放送にはどのような種類がありますか?
ブロードキャストを使用する場合、安全性とコンプライアンスに関してどのような点に注意する必要がありますか?
2. ブロードキャストとは何ですか?
ブロードキャストは、アプリケーション間またはアプリケーション内の通信に使用される Android オペレーティング システムのメカニズムです。これにより、1 つのアプリケーションがメッセージ (ブロードキャスト イベント) を送信し、他のアプリケーションがこれらのメッセージを受信して応答できるようになります。
3.ブロードキャスト送信
1. システムブロードキャスト
システム ブロードキャストは、デバイスのステータスの変化やシステム イベントをアプリケーションに通知するために、Android オペレーティング システム自体によって発行されるブロードキャストです。
共通システムブロードキャスト
ブロードキャストアクション | 説明する | 説明する |
---|---|---|
android.net.conn.CONNECTIVITY_CHANGE |
ネットワークステータスの変化 | デバイスのネットワーク接続ステータスが変化したときに送信されるブロードキャスト。このブロードキャストをリッスンすることでネットワーク接続の変化を検出し、それに応じてアプリケーションの動作を調整できます。 |
android.intent.action.BATTERY_CHANGED |
デバイスの電力の変化 | デバイスのバッテリーレベルが変化したときに送信されるブロードキャスト。アプリケーションは、このブロードキャストを聞くことで現在のバッテリー電力情報を取得し、電力の変化に基づいて適切な操作を実行できます。 |
android.intent.action.SCREEN_ON |
画面上 | デバイスの画面がオンになったときに送信されるブロードキャスト。アプリケーションはこのブロードキャストをリッスンして、画面関連機能の起動などの特定の操作を実行できます。 |
android.intent.action.SCREEN_OFF |
画面オフ | デバイスの画面がオフのときに送信されるブロードキャスト。アプリケーションはこのブロードキャストをリッスンして、画面関連の機能をオフにするなど、対応する操作を実行できます。 |
android.intent.action.BOOT_COMPLETED |
デバイスの起動が完了しました | デバイスの起動が完了したときに送信されるブロードキャスト。アプリケーションは、このブロードキャストをリッスンすることで、いくつかの初期化操作を実行したり、特定のサービスを開始したりして、デバイスの起動後にアプリケーションが正常に実行されることを確認できます。 |
android.intent.action.TIMEZONE_CHANGED |
タイムゾーンの変更 | デバイスのタイムゾーンが変更されたときに送信されるブロードキャスト。アプリケーションは、タイムゾーンの変更に基づいて時間関連の機能を調整できます。 |
android.intent.action.AIRPLANE_MODE |
フライトモードの変更 | デバイスの機内モードがオンまたはオフのときに送信されるブロードキャスト。アプリケーションはこのブロードキャストをリッスンして、適切なアクションを実行できます。 |
android.intent.action.MEDIA_MOUNTED |
記憶メディアがマウントされています | ストレージ メディア (SD カードなど) がデバイスにマウントされているときに送信されるブロードキャスト。アプリケーションは、このブロードキャストをリッスンすることで、ストレージ メディアのマウント イベントに応答できます。 |
android.intent.action.MEDIA_REMOVED |
ストレージメディアが取り外されました | ストレージ メディア (SD カードなど) がデバイスから取り外されたときに送信されるブロードキャスト。アプリケーションはこのブロードキャストをリッスンし、それに応じて処理できます。 |
android.intent.action.PACKAGE_ADDED |
アプリケーションのインストールが完了しました | アプリケーションのインストール時に送信されるブロードキャスト。アプリケーションはこのブロードキャストをリッスンして、適切な操作を実行できます。 |
android.intent.action.PACKAGE_REMOVED |
アプリケーションのアンインストールが完了しました | アプリケーションのアンインストール時に送信されるブロードキャスト。アプリケーションはこのブロードキャストをリッスンして、適切な操作を実行できます。 |
android.intent.action.HEADSET_PLUG |
ヘッドフォンの抜き差しイベント | ヘッドフォンがデバイスに接続されているとき、またはデバイスから取り外されているときにブロードキャストが送信されます。アプリケーションはこのブロードキャストをリッスンし、それに応じて処理できます。 |
android.intent.action.WALLPAPER_CHANGED |
壁紙の変更 | デバイスの壁紙が変更されたときに送信されるブロードキャスト。アプリケーションはこのブロードキャストをリッスンし、それに応じて処理できます。 |
2.カスタムブロードキャスト
Android では、カスタム ブロードキャストの送信形式はシステム ブロードキャストと同様で、標準ブロードキャスト、オーダード ブロードキャスト、スティッキー ブロードキャストが使用できます。
1. 通常放送
通常のブロードキャストは、Android の一般的なブロードキャスト タイプです。これは非同期ブロードキャストです。つまり、ブロードキャストの送信後、送信者は受信者の処理結果を待たずに、すぐに戻ります。ブロードキャストに一致するすべての受信者は、ブロードキャスト メッセージを同時に受信します。
特徴
- ブロードキャストの送信者は、どの受信者がブロードキャスト メッセージを受信したかを知りません。また、受信者の実行順序に影響を与えることもできません。
- 受信者はブロードキャストの配信を中断したりキャンセルしたりすることはできません。
- ブロードキャストの送信と受信は完全に非同期であり、送信者と受信者の間に直接のやり取りはありません。
標準放送適用時
- ブロードキャスト メッセージは順序付けられた処理を必要としません。つまり、受信者間の実行順序は重要ではありません。
- ブロードキャスト メッセージの送信者は、受信者の処理結果を気にしません。
- ブロードキャストは、ブロードキャストの特定のフィルタリングを行わずに、一致するすべての受信者に送信する必要があります。
コード実装例
// 创建Intent对象
Intent intent = new Intent();
// 设置广播的动作
intent.setAction("com.example.MY_CUSTOM_ACTION");
// 发送有序广播
sendBroadcast(intent, null);
2. 順序付けられたブロードキャスト
順序付きブロードキャストは、Android のもう 1 つの一般的なブロードキャスト タイプです。標準のブロードキャストとは異なり、順序付けられたブロードキャストは優先順位に従って一致する受信機に送信され、各受信機はブロードキャストを処理した後、ブロードキャストを終了するか次の受信機にブロードキャストを渡すかを選択できます。
特徴
- 順序付けされたブロードキャストにより、受信者は優先順位に従ってブロードキャスト メッセージを処理できます。受信機は優先順位を設定することで、ブロードキャスト チェーン内の実行順序を制御できます。
- 各受信者は、他の受信者がブロードキャスト メッセージを受信し続けるのを防ぐために、ブロードキャストの配信を中断できます。
- 各受信者は結果コードを返すことができるため、順序付けされたブロードキャストの送信者は、受信者がブロードキャストを処理した結果を取得できます。
秩序あるブロードキャストが適用される場合
- ブロードキャスト メッセージは、受信者が期待どおりの順序で実行できるように、特定の順序で処理する必要があります。
- ブロードキャストの配信を制御し、受信機がブロードキャストの配信を中断できるようにする必要があります。
- 結果コードを設定してブロードキャスト送信者に結果を返すには、受信者間の通信とコラボレーションが必要です。
コード実装例
// 创建Intent对象
Intent intent = new Intent();
// 设置广播的动作
intent.setAction("com.example.MY_CUSTOM_ACTION");
// 发送有序广播
sendOrderedBroadcast(intent, null);
3.スティッキーブロードキャスト
Sticky Broadcast は、Android の特殊なタイプのブロードキャストです。標準ブロードキャストや順序付きブロードキャストとは異なり、スティッキー ブロードキャストは、一致する受信者が存在しない場合でもシステムに残ります。新しい受信者が登録すると、最新のスティッキー ブロードキャストをすぐに受信します。
特徴
- スティッキー ブロードキャストは、新しい受信者が登録されるまでシステムに残ります。ブロードキャストがしばらく送信されていても、受信者は最新のブロードキャスト メッセージを受信できます。
- 受信機は、登録後すぐに、次のブロードキャストの送信を待たずに、最新のスティッキー ブロードキャスト メッセージを受信します。
- スティッキー ブロードキャストを使用すると、実行されていないコンポーネントにアプリケーションの状態情報を渡したり、アプリケーションの再起動後に以前の状態を復元したりできます。
スティッキーブロードキャスト適用時
- 受信者が最新のブロードキャスト メッセージをすぐに取得できるようにするには、受信者が登録される前にブロードキャストを送信する必要があります。
- ブロードキャスト メッセージは、実行していないコンポーネントがブロードキャストを受信するとすぐに処理できるように、そのコンポーネントに配信される必要があります。
- 以前に送信されたスティッキーブロードキャストメッセージを受信してアプリケーションを再起動した後、以前の状態に戻す必要があります。
コード実装例
// 创建Intent对象
Intent intent = new Intent();
// 设置广播的动作
intent.setAction("com.example.MY_CUSTOM_ACTION");
// 发送粘性广播
sendStickyBroadcast(intent);
3. ローカル放送
ローカル ブロードキャストは、アプリケーションの内部コンポーネント間の通信に使用されるアプリケーション固有のブロードキャスト メカニズムです。グローバル ブロードキャストとは異なり、ローカル ブロードキャストはアプリケーションの境界内でのみ伝播し、アプリケーション コンテキストを離れません。
特徴
- ローカル ブロードキャストはアプリケーション内でのみ伝播され、他のアプリケーションに漏洩しないため、より高いセキュリティが提供されます。
- ローカル ブロードキャストの伝播範囲はアプリケーションの境界に限定されており、他のアプリケーションには影響しません。
- ローカル ブロードキャストの送信と受信は同期しています。つまり、送信者は受信者の処理結果を待ちます。
ローカル放送が適用される場合
- 他のアプリケーションにブロードキャストを渡すことなく、アプリケーション内のコンポーネント間で通信します。
- 他のアプリケーションへの意図しない影響を避けるために、ブロードキャスト メッセージがアプリケーション内でのみ有効であることを確認する必要があります。
- 受信側がブロードキャスト メッセージを処理した結果を同期して待つ必要があります。
コード例
// 创建Intent对象
Intent intent = new Intent();
// 设置广播的动作
intent.setAction("com.example.MY_LOCAL_ACTION");
// 发送本地广播
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
4. 放送の受信
Android でブロードキャストを受信するには、ブロードキャスト レシーバー (BroadcastReceiver) を作成する必要があります。ブロードキャスト レシーバーは、アプリケーションに送信されたブロードキャスト メッセージを受信して処理するコンポーネントです。
1.ブロードキャストレシーバークラスを作成する
BroadcastReceiverを継承するクラスを作成し、onReceive(Context, Intent)メソッドを実装します。onReceiveメソッドにはブロードキャスト受信後の処理ロジックを記述します。
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 在这里编写接收到广播后的处理逻辑
// 根据广播的动作或其他信息进行相应的操作
}
}
2. 放送受信機の登録
1. 静的登録
- 静的登録は、タグ内でブロードキャスト レシーバーのクラス名と関連する設定を宣言することによって、アプリケーションのマニフェスト ファイル (AndroidManifest.xml) に登録されます。
- 静的に登録されたブロードキャスト レシーバーは、アプリケーションのインストール時にシステムに認識され、アプリケーションが実行されているかどうかに関係なく、ブロードキャスト メッセージを受信できます。
- 例:
<receiver
android:name=".MyBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.example.MY_CUSTOM_ACTION" />
</intent-filter>
</receiver>
2. 動的登録
- 動的登録では、 registerReceiver() メソッドを使用して、アプリケーション コード内でブロードキャスト レシーバーを動的に登録します。
- 動的に登録されたブロードキャスト レシーバーは、 registerReceiver() メソッドを呼び出した後でのみブロードキャスト メッセージを受信できるため、メモリ リークを避けるために、適切なタイミングで unregisterReceiver() メソッドを呼び出して登録を解除する必要があります。
- 例:
// 创建广播接收器实例
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
// 创建IntentFilter对象,并添加接收的广播动作
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.MY_CUSTOM_ACTION");
// 注册广播接收器
context.registerReceiver(receiver, filter);
3. 受信したブロードキャストを処理する
ブロードキャスト受信後、ブロードキャスト受信機(BroadcastReceiver)のonReceive(Context, Intent)メソッドに処理ロジックを記述する必要があります。
1. ブロードキャスト レシーバー クラスに onReceive メソッドを実装します。
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 在这里编写接收到广播后的处理逻辑
}
}
2. Intentオブジェクトを通じてブロードキャスト関連情報を取得する
- アクション: getAction() メソッドを使用してブロードキャスト アクションを取得し、アクション タイプに応じて対応する操作を実行します。
- データ: ブロードキャストがデータを伝送する場合は、getData() メソッドを使用してブロードキャスト データを取得します。
- 追加情報 (Extras): getExtras() メソッドを使用して、ブロードキャストされた追加情報を取得します。特定の情報をキーと値のペアの形式で取得できます。
- 例:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Uri data = intent.getData();
Bundle extras = intent.getExtras();
// 根据广播的动作、数据或额外信息进行相应的处理
}
}
3. 適切な操作を実行します
- ブロードキャストアクションやその他の情報に基づいて、UIの更新、サービスの開始、通知の送信などの適切な操作を実行します。
- Context オブジェクトを使用して、アクティビティの開始、システム サービスの取得などの特定の操作を実行できます。
- 例
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if ("com.example.MY_CUSTOM_ACTION".equals(action)) {
// 执行相应的操作
// ...
}
}
}