發送有序廣播
- 有序廣播可以被攔截,且優先順序搞得接收者可以攔截優先順序低的
- 廣播接受者的優先順序的取值範圍是:1000(最高)~ -1000(最低)
- 相同的優先順序下,接收的順序要看資訊清單檔中的聲明順序,先聲明先接收廣播
- 有序廣播使用sendOrderedBroadcast()方法發送,可以使用abortBroadcast()方法攔截 *廣播接收者的優先順序可以在資訊清單檔中聲明接收者時,在<intent-filter>標籤下通過設定“android:property”屬性來設定
我們新建立一個項目,來示範無序廣播的發送和接收過程
2.在預設的MainActivity的布局中添加一個按鈕,綁定事件,該事件的核心功能是發送一個有序廣播,MainActivity類代碼清單如下:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);}public void sendOrder(View view) { // 意圖 Intent intent = new Intent(); //定義動作 intent.setAction("com.itheima.data"); //發送有序廣播 //第一個參數 Intent類型:意圖 //第二個參數 String類型 receiverPermission,接收器需要的許可權 //第三個參數BroadcastReceiver類型,自己定義的接收器作為最終接收器 //第四個參數Handler類型,用於執行接收器的回調,如果為null則在主線程中執行 //第五個參數int類型,結果代碼的初始碼 //第六個參數初始化參數 //第七個參數Bundle類型,額外的資料 sendOrderedBroadcast(intent, null, null, null, RESULT_OK, "1萬元錢", null);}
3.分別編寫MyReceiver和MyReceiver2類,繼承BroadcastReceiver類
MyReceiver類代碼清單:
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); String resultData = getResultData(); Toast.makeText(context, "MyReceiver接收到"+action+"發布的廣播:"+resultData, 1).show(); System.out.println("MyReceiver接收到"+action+"發布的廣播:"+resultData); }}
MyReceiver2類代碼清單:
public class MyReceiver2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); String resultData = getResultData(); Toast.makeText(context, "MyReceiver2接收到"+action+"發布的廣播:"+resultData, 1).show(); System.out.println("MyReceiver2接收到"+action+"發布的廣播:"+resultData); }}
4.在AndroidManifest.xml中註冊MyReceiver和MyReceiver2:
<receiver android:name="com.itheima.broadcastAndreceiver.MyReceiver"> <intent-filter android:priority="1000"> <action android:name="com.itheima.data"></action> </intent-filter></receiver><receiver android:name="com.itheima.broadcastAndreceiver.MyReceiver2"> <intent-filter android:priority="-1000"> <action android:name="com.itheima.data"></action> </intent-filter></receiver>
在上面資訊清單檔中我們給MyReceiver設定了最高優先順序1000,給MyReceiver2設定了最低優先順序-1000。
5.下面我們分多鐘情況,分別示範有序廣播的接收規律
直接部署上面的工程到模擬器,點擊發送廣播按鈕,控制台結果為:
6.修改MyReceiver類的代碼:在onReceive方法中添加abortBroadcast()方法,
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); String resultData = getResultData(); Toast.makeText(context, "MyReceiver接收到"+action+"發布的廣播:"+resultData, 1).show(); System.out.println("MyReceiver接收到"+action+"發布的廣播:"+resultData); abortBroadcast(); }}
然重新部署該工程,運行,點擊發送廣播按鈕。這時控制台列印資訊為
這說明優先順序高的的廣播接收者可以修改或攔截廣播 優先順序低的廣播接收者收到修改後的廣播或收不到廣播
7.在第二種情況的基礎上,我們修改MainActivity類中sendOrder方法,修改sendOrderedBroadcast中第三個參數,指定一個最終接收器
public void sendOrder(View view) { // 意圖 Intent intent = new Intent(); intent.setAction("com.itheima.data"); sendOrderedBroadcast(intent, null, new MyReceiver2(), null, RESULT_OK, "1萬元錢", null);}
運行上面的項目,我們可以控制台輸出如下資訊:
雖然在MyReceiver中我們調用了abortBroadcast();方法,但是廣播依然被MyReceiver2接收到。原因是我們在sendOrderedBroadcast方法中指定了MyReceiver2接收器為最終接收器,因此該廣播被終止的時候MyReceiver2接收器依然可以接收到廣播。
8.在第3種情形的基礎上,我們修改MyReceiver類,我們將該類中的onReceive方法中的abortBroadcast();方法去掉。然後運行上面工程。發現控制台輸入如下資訊
我們發現MyReceiver第一個接收到廣播,MyReceiver2第二個接收到廣播,然後MyReceiver2又接收到一次廣播。對的,結果確實是這樣,因為我們在sendOrderedBroadcast方法中,將MyReceiver2作為最終接收器,那麼我們發出的廣播會被所有合格接收器接收,最後指定的最終接收器不管是否已經接收過資訊依然會再次接收。