靜態/動態註冊廣播的區別,靜態動態廣播區別
廣播接收器註冊一共有兩種形式 : 靜態註冊和動態註冊.
兩者及其接收廣播的區別:
1.動態註冊的廣播永遠要快於靜態註冊的廣播,不管靜態註冊的優先級設置的多高,不管動態註冊的優先級有多低>\
2.動態註冊廣播不是常駐型廣播,也就是說廣播跟隨activity的生命週期。注意: 在activity結束前,移除廣播接收器。
靜態註冊是常駐型,也就是說當應用程序關閉後,如果有信息廣播來,程序也會被系統調用自動運行。
3.在同一個優先級下,誰先啓動的快,誰將先接收到廣播.
廣播分爲:有序廣播、無序廣播(普通廣播)、粘性廣播
無序廣播(普通廣播):
- 普通廣播是通過sendBroadcast來發送的;
- 普通廣播是完全異步的,接受器收到廣播的順序是無法確定的,接受器也無法中止該廣播。
有序廣播:
- 有序廣播是通過Context.sendOrderedBroadcast來發送;
- 有序廣播的優先級可以設置屬性android:priority/setPriority(),數越大優先級別越高,取值範圍:-1000 到 1000(其實最大可以爲 int 最大值即:2147483647/2的31次方減1);
- 廣播最先發送到優先級高的接受器那裏;
- 優先級高的接受器可以決定是否繼續傳遞廣播,可以使用abortBroadcast函數,丟棄該廣播;
- 可以使用setResult系列函數將結果傳給下一個BroadcastReceiver,通過getResult系列函數來取得上個BroadcastReceiver返回的結果;
短信廣播屬於有序廣播。
廣播的優先級:
- 優先級設置高的高於低優先級的。
- 動態註冊的廣播優先級高於靜態註冊。
- 動態註冊的優先級相同的廣播,先註冊的高於後註冊的。
- 靜態註冊的優先級相同的廣播,先安裝的高於後安裝的,其次取決於Sting [] apps = new File(/system/app/).list();的排序。
示例:
假設有如下優先級的 5 個接收器
1.動態 A(優先級=1)
2.動態 B(優先級=2)
3.動態 C(優先級=2)
4.靜態 D(優先級=1)
5.靜態 E(優先級=2)
並且 B 先於 C 註冊
那麼實際接收順序應爲
B C E A D
也就是說,如果靜態接收器的優先級高於動態接收器的優先級,那麼還是靜態接收器先接收到廣播(比如接收 SMS 廣播)
參考資料:
http://www.bkjia.com/Androidjc/863165.html