Android 順次ブロードキャスト sendOrderedBroadcast
順次ブロードキャストは非順次ブロードキャスト(通常の
sendBroadcast)と対比されます。直列に1つずつ配信されるブロードキャストで、面接でよく出る頻出問題です。
一、順次ブロードキャストの特徴
- 直列実行(線形配信):レシーバーは順番に1つずつ受信します。前のレシーバーの処理が完了してから次に渡され、同時に受信することはありません。
- ブロードキャストを中断可能:レシーバーの
onReceive()内でabortBroadcast()を呼び出すとブロードキャストが終了し、後続のすべてのレシーバーはこのブロードキャストを受信できなくなります。 - 優先度で受信順が決まる:
android:priority。数値が大きいほど優先度が高く、早くブロードキャストを受信します。- 値の範囲:
-1000 ~ 1000 - 例:demo1のpriority=100、demo2に小さい値を設定すると、demo1が先に受信、demo2が後に受信
- 値の範囲:
- レシーバー同士でブロードキャストのデータを保持・編集し、後ろへ渡すことができます。
注意:非順次ブロードキャスト sendBroadcast() は中断できず優先度もありません。複数のレシーバーはほぼ同時に受信します
二、順次ブロードキャスト送信コード(送信側Demo1)
Intent intent = new Intent("com.foxdevelop.www.senddemo.MY_BROADCAST");
// 順次ブロードキャストを送信。第2引数は権限(nullは権限制限なし)
sendOrderedBroadcast(intent, null);
Code language: JavaScript (javascript)
三、静的登録レシーバー、優先度設定 AndroidManifest.xml
<receiver android:name=".MyReceiver">
<!-- priority 優先度、数値が大きいほど早く受信 -->
<intent-filter android:priority="100">
<action android:name="com.foxdevelop.www.senddemo.MY_BROADCAST"/>
</intent-filter>
</receiver>
Code language: HTML, XML (xml)
Demo2のレシーバーに100より小さいpriority、例えば
android:priority="50"を設定。実行順序:Demo1レシーバー → Demo2レシーバー
四、ブロードキャスト中断 abortBroadcast()
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "自作ブロードキャストを受信しました", Toast.LENGTH_LONG).show();
// 順次ブロードキャストを中断!後の優先度の低いレシーバーはこのブロードキャストを受信できなくなる
abortBroadcast();
}
Code language: JavaScript (javascript)
重要ポイント:
abortBroadcast()は順次ブロードキャストにのみ有効。通常の非順次ブロードキャストで呼び出しても効果がありません。- 一度中断すると、ブロードキャストの配信連鎖が終了します。
五、順次ブロードキャストの完全な実行フロー
- Demo1が
sendOrderedBroadcastを呼び出しブロードキャストを送信 - システムがActionに一致する全ブロードキャストレシーバーを検索し、priorityの高い順にソート
- 優先度100(Demo1レシーバー)が先に受信 → onReceive実行
- 内部で
abortBroadcast()を呼び出した場合、即時終了、Demo2(priority50)はブロードキャストを受信できない - abortBroadcastを呼び出さなければ、ブロードキャストはDemo2レシーバーへ続く
- 内部で
- Demo2レシーバーがonReceiveを実行
比較表
| 特徴 | 非順次ブロードキャスト sendBroadcast | 順次ブロードキャスト sendOrderedBroadcast |
|---|---|---|
| 受信順序 | 並列、ほぼ同時受信、順序なし | 直列、priority優先度順、優先度高い方が先に受信 |
| ブロードキャスト中断 | 中断不可、abortBroadcast無効 | abortBroadcastを呼んで中断可能 |
| データ配信 | 編集後のデータを次の受信者に渡せない | Intentのデータを編集し後続へ渡せる |
順次ブロードキャスト
Previous: Android でのアプリ間ブロードキャスト受信
Next: Android ローカルブロードキャスト