廣播和廣播接收器
廣播接收器的註冊方式有兩種,靜態註冊廣播(在AndroidManifest中註冊)和動態註冊廣播(在Java程式碼中註冊)。從Android8開始,取消了大多數的靜態註冊廣播。
一.動態註冊廣播接收器(動態註冊的廣播接收器只有程式啟動後才能收到廣播)
1.定義一個繼承自BroadcastReceiver的類(可以是定義在活動類中的內部類,也可以是一個額外的java類),並重寫其父類的onReceive()方法,其中onReceive()方法中就是接收到廣播時的處理。
2.在活動類中宣告IntentFilter引用和繼承自BroadcastReceiver的類的引用,然後在活動類中的onCreate()方法中例項化IntentFilter物件,為其新增action。
3.在活動類中的onCreate()方法中例項化繼承自BroadcastReceiver的類的物件,並且通過registerReceiver(BroadcastReceiver receiver,IntentFilter filter)註冊廣播。
4.在活動類中的onDestroy()方法中通過unregisterReceiver(BroadcastReceiver receiver)取消註冊廣播。
(注:動態註冊的廣播接收器一定要取消註冊)
二.靜態註冊廣播接收器
直接通過New->Other->Broadcast Receiver建立廣播接收器,Exported
(注:不要在onReceiver()中新增過多邏輯或者進行耗時操作,因為廣播接收器中不允許開啟執行緒)
三.傳送廣播
廣播分為標準廣播和有序廣播。它是一種可以跨程序的通訊方式。
廣播的傳送也是要藉助於 Intent
標準廣播:
// 構建Intent物件,傳入要傳送的廣播的action值,Intent中可以攜帶資料
Intent intent = new Intent("……");
// 傳送廣播,該方法在Context類中
sendBroadcast(intent);
有序廣播:
// 構建Intent物件,傳入要傳送的廣播的action值,Intent中可以攜帶資料
Intent intent = new Intent("……");
// 傳送廣播,該方法在Context類中
sendOrderedBroadcast(intent, null);
可以在所有接收到該廣播的廣播接收器中設定優先順序,就是在<intent-filter>標籤上新增一個屬性 android:priority="100" ,其中100表示優先順序的數值。然後在該廣播接收器中的onReceive()方法最後加上 abortBroadcast() 即可截斷廣播的繼續傳送。
四.本地廣播
本地廣播:發出的廣播只能在當前應用程式的內部進行傳遞,廣播接收器只能接收來自本應用程式發出的廣播,減少了安全性問題。無法通過靜態註冊的廣播接收器接收,傳送本地廣播比傳送系統全域性廣播高效。
動態註冊本地廣播接收器步驟如下:
1.定義一個繼承自BroadcastReceiver的類(可以是定義在活動類中的內部類,也可以是一個額外的java類),並重寫其父類的onReceive()方法,其中onReceive()方法中就是接收到廣播時的處理。
2.在活動類中宣告IntentFilter引用、繼承自BroadcastReceiver的類的引用和LocalBroadcastManager的引用,如下:
// 宣告IntentFilter引用
private IntentFilter intentFilter;
// 宣告繼承自BroadcastReceiver的類的引用
private XxxReceiver xxxReceiver;
// 宣告LocalBroadcastManager的引用
private LocalBroadcastManager localBroadcastManager;
3.在onCreate()中例項化上述三個引用,如下:
// 獲取LocalBroadcastManager的例項
localBroadcastManager = LocalBroadcastManager.getInstance(this);
// 例項化IntentFilter物件,併為其新增action
intentFilter = new IntentFilter("……");
// 例項化廣播物件
xxxReceiver = new XxxReceiver();
4.在onCreate()中註冊本地廣播接收器
localBroadcastManager.registerReceiver(xxxReceiver, intentFilter);
5.在onDestroy()中取消註冊
localBroadcastReceiver.unregisterReceiver(xxxReceiver);
傳送本地廣播:
// 構建Intent物件,傳入要傳送的廣播的action值,Intent中可以攜帶資料
Intent intent = new Intent("……");
// 傳送本地廣播
localBroadcastManager.sendBroadcast(intent);