国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

Android:廣播!BroadcastReceiver

2019-11-02 15:08:09
字體:
來源:轉載
供稿:網友

 什么是BroadcastReceiver?

  BroadcastReceiver,廣播接收者,它是一個系統全局的監聽器,用于監聽系統全局的Broadcast消息,所以它可以很方便的進行系統組件之間的通信。

  BroadcastReceiver雖然是一個監聽器,但是它和之前用到的OnXxxListener不同,那些只是程序級別的監聽器,運行在指定程序的所在進程中,當程序退出的時候,OnXxxListener監聽器也就隨之關閉了,但是BroadcastReceiver屬于系統級的監聽器,它擁有自己的進程,只要存在與之匹配的Broadcast被以Intent的形式發送出來,BroadcastReceiver就會被激活。

  雖然同屬Android的四大組件,BroadcastReceiver也有自己獨立的聲明周期,但是和Activity、Service又不同。當在系統注冊一個BroadcastReceiver之后,每次系統以一個Intent的形式發布Broadcast的時候,系統都會創建與之對應的BroadcastReceiver廣播接收者實例,并自動觸發它的onReceive()方法,當onReceive()方法被執行完成之后,BroadcastReceiver的實例就會被銷毀。雖然它獨自享用一個單獨的進程,但也不是沒有限制的,如果BroadcastReceiver.onReceive()方法不能在10秒內執行完成,Android系統就會認為該BroadcastReceiver對象無響應,然后彈出ANR(Application No Response)對話框,所以不要在BroadcastReceiver.onReceive()方法內執行一些耗時的操作。

  如果需要根據廣播內容完成一些耗時的操作,一般考慮通過Intent啟動一個Service來完成該操作,而不應該在BroadcastReceiver中開啟一個新線程完成耗時的操作,因為BroadcastReceiver本身的生命周期很短,可能出現的情況是子線程還沒有結束,BroadcastReceiver就已經退出的情況,而如果BroadcastReceiver所在的進程結束了,該線程就會被標記為一個空線程,根據Android的內存管理策略,在系統內存緊張的時候,會按照優先級,結束優先級低的線程,而空線程無異是優先級最低的,這樣就可能導致BroadcastReceiver啟動的子線程不能執行完成。

   BroadcastReceiver的種類

  上面提到,當系統以一個Intent的形式發送一個Broadcast出去之后,所有與之匹配的BroadcastReceiver都會被實例化,但是這里是有區別的,根據Broadcast的傳播方式區別,在系統中有如下兩種Broadcast:

普通廣播:Normal Broadcase,它是完全異步的,也就是說,在邏輯上,當一個Broadcast被發出之后,所有的與之匹配的BroadcastReceiver都同時接收到Broadcast。優點是傳遞效率比較高,但是也有缺點,就是一個BroadcastReceiver不能影響其他響應這條Broadcast的BroadcastReceiver。 有序廣播:Ordered Broadcast,它是同步執行的,也就是說有序廣播的接收器將會按照預先聲明的優先級依次接受Broadcast,是鏈式結構,優先級越高(-1000~1000),越先被執行。因為是順序執行,所有優先級高的接收器,可以把執行結果傳入下一個接收器中,也可以終止Broadcast的傳播(通過abortBroadcast()方法),一旦Broadcast的傳播被終止,優先級低于它的接收器就不會再接收到這條Broadcast了。

  雖然系統存在兩種類型的Broadcast,但是一般系統發送出來的Broadcast均是有序廣播,所以可以通過優先級的控制,在系統內置的程序響應前,對Broadcast提前進行響應。這就是市場上一些攔截器類(如:短信攔截器、電話攔截器)的軟件的原理。 

 如何發送一個廣播

  上面已經介紹了系統中兩種不同的Broadcast,而根據Broadcast傳播的方式,Context提供了不同的方法來發布它們:

sendBroadcast():發送普通廣播。 sendOrderedBroadcast():發送有序廣播。

  以上兩個方法都有多個重載方法,根據不同的場景使用,最簡單的莫過于直接傳遞一個Intent來發送一個廣播。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阜阳市| 清水县| 衡山县| 宝清县| 米易县| 墨脱县| 荥阳市| 日土县| 色达县| 宿迁市| 西乌珠穆沁旗| 长子县| 桐乡市| 安新县| 会昌县| 乌拉特前旗| 宜宾县| 大关县| 嘉峪关市| 玉溪市| 休宁县| 景东| 钟山县| 元氏县| 阳山县| 双鸭山市| 廉江市| 道真| 综艺| 闽清县| 大田县| 南乐县| 西充县| 龙里县| 乐都县| 铁岭市| 毕节市| 长顺县| 南江县| 长白| 英超|