BroadCastReceiver的詳解與使用

1.廣播:系統在運行的時候會發生很多事件,那麼當事件發生的時候系統就會發出廣播通知對此類型的廣播感興趣的程序,應用程序使用廣播接受者接受廣播,以執行相應的代碼。(例如電量改變等)

2.廣播接受者:BroadCastReceiver,Android四大組件之一,並不是一個Context,是一種消息性組件,可以在不同組漸漸通信及APP之間傳遞消息。

3.實現原理:

Android中的廣播使用了設計模式中的觀察者模式,基於消息的發佈/訂閱

有三個角色:1.廣播發送者

2.廣播接受者

3.消息中心(AMS)

在這裏插入圖片描述
原理描述:1.廣播接收者通過Binder機制在AMS中註冊

2.廣播發送者通過Binder機制向AMS中發送廣播

3.AMS根據廣播發送者要求,在已註冊列表中,尋找合適的廣播接收者

4.AMS將廣播發送到合適的廣播接收者的相應循環隊列中

5.廣播接收者通過消息隊列拿到此廣播,並回調OnRecerver()

2

4.使用流程:

1.自定義廣播接收者BroadcastRecerver

*繼承BroadcastRecerver *複寫OnRecerver()方法

*廣播接收者接受到相應廣播後,會自動回調OnRecerver()方法

*一般情況下,此方法會涉及與其他組件之間的交互,如啓動Service等

*OnReceiver()方法運行在UI線程,不能執行耗時操作,否則會報ANR

2.廣播接收者的註冊:

*靜態註冊(應用程序關閉後,如果有廣播,程序依舊被系統調用)

在清單文件中通過標籤聲明

*動態註冊

在代碼中使用Context.registerReceiver()註冊

動態廣播最好在Activity的OnResume()中註冊,OnPause()註銷

原因 :*對於動態廣播,有註冊必然會有註銷,否則會導致內存泄漏(註銷調用unregisterreceiver()方法)。

        *在OnResume()註冊、OnPause()註銷是因爲OnPause()在APP死亡之前一定會被執行,從而保證廣播在APP死亡之前一定會被銷燬,從而防止內存泄露。不在OnCreate()、OnDestory()或OnStart()、OnStop()註冊、註銷是因爲:當系統因爲內存不足要回收Activity佔用的資源時,Activity在執行完OnPause()方法後就會被銷燬,有些生命週期方法OnStop()、OnDstory()就不會被執行。當再回到此Activity時,是從OnCreate()方法開始執行。假設我們將廣播的註銷放在OnStop()、OnDstory()方法,及廣播仍未被註銷,從而導致內存泄漏。

靜態註冊優點:不受任何組件的生命週期影響。缺點:耗電,佔內存

動態註冊優點:靈活,跟隨組件的生命週期變化。

3.廣播的發送:

發送無序廣播調用sendBroadCast()

發送有序廣播調用sendOrderdBroadCast()

4.廣播的類型:

無序廣播:所有的廣播接受者都可以接收到此種類型的廣播,且不可以被攔截

有序廣播:發送出去的廣播被廣播接收者按照先後順序接收,按照Priority()屬性值從大到小排序,如果值相同,動態註冊的廣播優先,並且廣播可以被攔截(調用.abortBroadCast()),攔截後優先級低的廣播接收者便不能收到廣播了。

優先級:級別數值是在-1000到1000之間,超出範圍也沒關係

全局廣播:所有的APP都可以接收到該廣播

本地廣播:只在本APP中傳播

系統廣播:Android中內置了多個系統廣播,每個廣播都有特定的Action。例如:Intent.ACTION_SREEN_OFF

5: 廣播中傳遞數據:

獲取數據:1.直接從OnReceirver()方法中的Intent獲取

2.broaddcastReceiver.getResultData();

更改數據:setResult()

發送無序廣播的時候,廣播的接收順序是按照廣播在清單文件中聲明順序由上而下執行的。

如果廣播的接受者定義了優先級,廣播的接收順序是按照廣播接收者的優先級執行的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章