1. 程式人生 > >四大元件 — BroadCastReceiver廣播接收者

四大元件 — BroadCastReceiver廣播接收者

BroadCastReceiver是Android的四大元件之一,其作用於 接收系統或應用發出的各種廣播。 


        廣播即是訊息,是由Android系統對外提供的一系列有關於系統及程式的提示資訊,向所有的應用程式進行廣播(傳送),其傳送根據其優先順序列表進行順序傳送。
當然,我們自己也可以自我定義一個廣播。
廣播接收者( BroadcastReceiver )其是用於接收廣播 Intent ,廣播 Intent 的傳送是通過呼叫 Context.sendBroadcast() 、           Context.sendOrderedBroadcast() 來實現的。通常一個廣播 Intent 可以被訂閱了此 Intent 的多個廣播接收者所接收。


        BroadcastReceiver 自身並不實現圖形使用者介面,但是當它收到某個通知後, BroadcastReceiver 可以啟動 Activity 作為響應,或者通過 NotificationMananger 提醒使用者,或者啟動 Service 等等。
  
BroadCastReceiver機制
        在Android 裡面有各種各樣的廣播,比如電池的使用狀態,電話的接收和簡訊的接收都會產生一個廣播。而應用程式開發者也可以監聽這些廣播並做出程式邏輯的處理。廣播是一種廣泛運用的在應用程式之間傳輸資訊的機制 。而 BroadcastReceiver 是對傳送出來的廣播進行過濾接收並響應的一類元件.當一條廣播被髮送出來時,系統是在所有清單檔案中遍歷,找到能接收這條廣播的廣播接收者,如果廣播接收者所在程序沒有啟動,那麼系統會啟動這個程序。


BroadCastReceiver使用場景
在現實生活當中:電臺通過傳送廣播發布訊息,買個收音機,就能收聽
Android系統中:系統在產生某個事件時傳送廣播,應用程式使用廣播接收者接收這個廣播,就知道系統產生了什麼事件。
Android系統在執行的過程中,會產生很多事件,比如開機、電量改變、收發簡訊、撥打電話、螢幕解鎖等等。


廣播的分發型別:
無序廣播 Normalbroadcasts:
無序廣播是完全非同步的,可以在同一時刻(邏輯上)被所有廣播接收者接收到。
優點:訊息傳遞的效率較高
缺點:接收者不能將處理結果傳遞給下一個接收者,並且無法終止廣播Intent的傳播


有序廣播 Ordered broadcasts:
系統會根據接收者宣告的優先順序(宣告在intent-filter元素的android:priority屬性中,數越大優先級別越高,取值範圍:-1000到1000,正值越大,優先順序越高。也可以呼叫IntentFilter物件的setPriority()進行設定)按順序逐個執行接收者,前面的接收者有權終止廣播(通過呼叫BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,後面的接收者就再也無法獲取到廣播。對於有序廣播,前面的接收者可以將處理結果存進廣播Intent,然後傳給下一個接收者。
優點:每個接收者可以選擇 終止該廣播,並且前面的接收者可以將處理結果存入廣播中,傳遞下去。
缺點:訊息傳遞的效率較低


廣播的註冊方式:
靜態註冊:就是在AndroidManifest.xml清單檔案中進行定義,並且註冊的廣播接收器必須繼承BroadcastReceiver類。
動態註冊:就是在程式中使用Context.registerReceiver註冊。


兩種註冊型別的區別:
靜態註冊:靜態註冊是當程式關閉後,如果有廣播發過來,還能啟動程式,類似於在系統後臺保留一段程式。
優點:就是無需擔心廣播接收器是否是關閉狀態,只要Android裝置處於開啟狀態,廣播接收器就能夠接收到。


動態註冊:動態註冊的生命週期跟程式的生命週期是一樣的,程式關閉後動態註冊的廣播是不能再接收到廣播的。
優點:在Android的廣播機制中,動態註冊的優先順序高於靜態註冊的優先順序,因此在必要情況下,我們需要動態註冊廣播接收器。


廣播的生命週期:
一共有3 步