Android廣播系統知識總結

以前面幾篇文章為基礎,總結一下Android廣播系統的一些知識

1、Android廣播分為有序廣播和普通廣播

2、Android廣播也可以分為前臺廣播和後臺廣播

3、廣播接收器的優先級默認是0

4、動態註冊的廣播接收器是非常駐型,一般是跟著Activity的生命周期走,所以在Activity結束前需要取消註冊廣播接收器;靜態註冊的廣播是常駐型,即使應用未啟動,當有相關的廣播發出時,其會被系統調用自動運行

5、當廣播為有序廣播時,優先級高的先接收(不分靜態和動態);同級別的廣播,動態優先於靜態;同級別同類型的廣播,靜態:先掃描的優先於後掃描的,動態:先註冊的優先於後註冊的

6、當廣播為普通廣播時(默認廣播)時,無視優先級,動態優先於靜態;同類型廣播,靜態:先掃描的有限於後掃描的,動態:先註冊的優先於後註冊的

7、動態註冊的廣播接收器,隻可以接收使用隱式Intent發送的廣播,顯示的Intent發送的廣播接收不到;靜態註冊的廣播接收器可以接收顯示Intent和隱式Intent發送的廣播,但是顯示Intent指示的ComponentName必須是靜態註冊的廣播接收器的組件名

8、如果廣播指定瞭FLAG_RECEIVER_REGISTERED_ONLY,則隻有動態註冊的接收器可以收到

9、不管是靜態註冊的還是動態註冊的receiver,均默認運行在UI主線程,動態註冊的receiver可以指定運行的線程

10、同一個BroadcastReceiver可以註冊多次,每次的IntentFilter可以不一樣,但是Handler和Context必須是一樣的,否則會報IllegalStateException異常。

11、串行隊列中的廣播客戶端收到後會調用服務端的finishReceiver,有序廣播的動態註冊的receiver和靜態註冊的都是在串行隊列中。服務端因為需要等待客戶端調用finishReceiver,以改變BroadcastRecord的狀態,所以可以實現串行分發。

服務端到客戶端的分發函數聲明為oneway表示不需要等待函數執行結果,而立馬返回。aidl中聲明瞭oneway,在生成的xx.stub中函數沒有reply.readexception,該函數會等待客戶端執行完成再返回。無論是串行隊列還是並行隊列中的AMS調用各App的接口均是one-way的,所以當一個BroadcastQueue在等待處理串行隊列中的廣播時,仍然可以發送普通廣播。

You May Also Like