前兩篇博文中簡單整理了普通廣播,其實還有有序廣播,有序廣播在開發中也是比不可少的,可以給廣播接收者設定優先級來控制接受順序,並卻可以中斷廣播傳遞等等。
一、兩種Broadcast:
· 普通廣播(Normal Broadcast):用sendBroadcast()方法發送。
普通廣播是完全異步的,邏輯上可以在同一時刻被所有匹配的接受者接收到,消息傳遞效率高,缺點是接受者不能將處理結果傳遞給下一個接收者,也無法終止廣播傳播。
· 有序廣播(Ordered Broadcast):用sendOrderedBroadcast()方法發送。
有序廣播的接收者們將按照事先生命的優先級依次接收,數越大優先級越高(取值范圍:-1000~10000),優先級可以聲明在<intent-filter android:priority="n".../>,也可以調用IntentFilter對象的setPriority設置。並且接收者可以終止傳播(調用abortBroadcast()方法即可終止),一旦終止后面接收者就無法接受廣播。另外,接受者可以將處理結果存入數據(可通過setResultExtras(Bundle)方法將數據存入Broadcast),當做Broadcast再傳遞給下一級接收者(可通過代碼Bundle bundle = getResultExtras(true)獲取上一級傳遞過來的數據)。
短信攔截原理:系統收到短信,發出的Broadcast屬於有序廣播,程序就可以通過設定優先級先接收到通知,然后終止傳遞。
二、舉個例子(有序廣播):
1、首先創建兩個BroadcastReceiver。讓第一個receive接收到廣播后中斷。
MyReceiver.java
1 public class MyReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 System.out.println("MyReceiver接受到消息"); 6 abortBroadcast(); //中斷廣播,不會再響比它有優先級低得廣播再傳播下去了 7 } 8 }
MyReceiver1.java
1 public class MyReceiver1 extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 System.out.println("MyReceiver1接受到消息"); 6 } 7 }
2、然后將兩個receiver的action在AndroidManifest.xml文件中配置成一樣的,並且設置成不同的優先級,代碼如下:
1 <receiver android:name=".MyReceiver"> 2 <!-- priority優先級:數字越高優先級越高 --> 3 <intent-filter android:priority="5" > 4 <action android:name="com.codingblock.myreceiver.intent.action.MyReceiver"/> 5 </intent-filter> 6 </receiver> 7 <receiver android:name=".MyReceiver1"> 8 <intent-filter android:priority="4"> 9 <action android:name="com.codingblock.myreceiver.intent.action.MyReceiver"/> 10 </intent-filter> 11 </receiver>
3.最后在MainActivity中發送廣播
1 public class MainActivity extends Activity { 2 3 Button btn_send_receiver; 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 btn_send_receiver = (Button)findViewById(R.id.btn_send_receiver); 9 btn_send_receiver.setOnClickListener(new OnClickListener() { 10 11 @Override 12 public void onClick(View v) { 13 Intent intent = new Intent(); 14 intent.setAction("com.codingblock.myreceiver.intent.action.MyReceiver"); 15 sendOrderedBroadcast(intent, null);//有序廣播需要用sendOrderedBroadcast()方法發送 16 } 17 }); 18 } 19 }
布局文件只有一個Button,比較簡單,在此就不貼出了。
通過運行測試就會發現,點擊發送消息按鈕后只有MyReceiver接收到了消息,廣播就被中斷了。日志如下: