1. 程式人生 > >廣播和廣播接收器

廣播和廣播接收器

廣播接收器的註冊方式有兩種,靜態註冊廣播(在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

屬性表示是否允許接收本程式以外的廣播,Enabled屬性表示是否啟用該廣播接收器。通過這種方式建立的廣播接收器會自動在AndroidManifest中註冊,然後我們自己要在<receiver>標籤中新增<intent-filter>標籤,在該標籤中新增對應的action。靜態註冊廣播接收器的方法中也是通過重寫onReceiver()實現接收廣播時的處理

(注:不要在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);