有序廣播

Android 有序廣播 sendOrderedBroadcast

有序廣播是相對於無序廣播(一般sendBroadcast)而言,屬於依序逐個傳遞的廣播,也是面試常見考點。

一、有序廣播特性

  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");
// 發送有序廣播,第二個參數為權限(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資料並向後傳遞

有序廣播

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *