Android 有序廣播 sendOrderedBroadcast
有序廣播是相對於無序廣播(一般
sendBroadcast)而言,屬於依序逐個傳遞的廣播,也是面試常見考點。
一、有序廣播特性
- 循序執行(線性傳遞):接收器依照順序逐一接收,必須等前一個接收器處理完畢,才會傳給下一個,不會同時收到。
- 可中斷廣播:在接收器的
onReceive()內呼叫abortBroadcast(),廣播就會終止,排在後面所有接收器都收不到這則廣播。 - 優先權決定接收順序:
android:priority,數值越大優先權越高,越早收到廣播。- 取值範圍:
-1000 ~ 1000 - 範例:demo1 的 priority=100,demo2 設定更小的值,則demo1 先接收,demo2 後接收
- 取值範圍:
- 接收器之間可以攜帶、修改廣播資料,再往後傳遞。
注意:無序廣播 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()只對有序廣播有效;一般無序廣播呼叫此方法沒有作用。- 一旦中斷,廣播傳遞鏈就會終止。
五、有序廣播完整執行流程
- Demo1呼叫
sendOrderedBroadcast送出廣播 - 系統尋找所有符合Action的廣播接收器,依照priority由高到低排序
- 優先權100(Demo1接收器)優先收到 → 執行onReceive
- 如果程式內呼叫
abortBroadcast(),直接終止,Demo2(priority50)收不到廣播 - 若不呼叫abortBroadcast,廣播繼續傳給Demo2接收器
- 如果程式內呼叫
- Demo2接收器執行onReceive
對照表
| 特性 | 無序廣播 sendBroadcast | 有序廣播 sendOrderedBroadcast |
|---|---|---|
| 接收順序 | 平行執行,幾乎同時接收,無順序 | 循序執行,依priority優先權,優先權高者先接收 |
| 廣播中斷 | 不可中斷,abortBroadcast無效 | 可呼叫abortBroadcast中斷 |
| 資料傳遞 | 無法把修改後的資料傳給下一個接收者 | 可修改Intent資料並向後傳遞 |
有序廣播
Previous: Android 跨應用程式接收廣播
Next: Android 本地廣播