順次ブロードキャスト

Android 順次ブロードキャスト sendOrderedBroadcast

順次ブロードキャストは非順次ブロードキャスト(通常のsendBroadcast)と対比されます。直列に1つずつ配信されるブロードキャストで、面接でよく出る頻出問題です。

一、順次ブロードキャストの特徴

  1. 直列実行(線形配信):レシーバーは順番に1つずつ受信します。前のレシーバーの処理が完了してから次に渡され、同時に受信することはありません。
  2. ブロードキャストを中断可能:レシーバーのonReceive()内でabortBroadcast()を呼び出すとブロードキャストが終了し、後続のすべてのレシーバーはこのブロードキャストを受信できなくなります。
  3. 優先度で受信順が決まる:android:priority。数値が大きいほど優先度が高く、早くブロードキャストを受信します。
    • 値の範囲:-1000 ~ 1000
    • 例:demo1のpriority=100、demo2に小さい値を設定すると、demo1が先に受信、demo2が後に受信
  4. レシーバー同士でブロードキャストのデータを保持・編集し、後ろへ渡すことができます。

注意:非順次ブロードキャスト 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()は順次ブロードキャストにのみ有効。通常の非順次ブロードキャストで呼び出しても効果がありません。
  • 一度中断すると、ブロードキャストの配信連鎖が終了します。

五、順次ブロードキャストの完全な実行フロー

  1. Demo1がsendOrderedBroadcastを呼び出しブロードキャストを送信
  2. システムがActionに一致する全ブロードキャストレシーバーを検索し、priorityの高い順にソート
  3. 優先度100(Demo1レシーバー)が先に受信 → onReceive実行
    • 内部でabortBroadcast()を呼び出した場合、即時終了、Demo2(priority50)はブロードキャストを受信できない
    • abortBroadcastを呼び出さなければ、ブロードキャストはDemo2レシーバーへ続く
  4. Demo2レシーバーがonReceiveを実行

比較表

特徴非順次ブロードキャスト sendBroadcast順次ブロードキャスト sendOrderedBroadcast
受信順序並列、ほぼ同時受信、順序なし直列、priority優先度順、優先度高い方が先に受信
ブロードキャスト中断中断不可、abortBroadcast無効abortBroadcastを呼んで中断可能
データ配信編集後のデータを次の受信者に渡せないIntentのデータを編集し後続へ渡せる

順次ブロードキャスト

コメントを残す

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