Android學習筆記(十二)BroadcastReceiver的有序廣播和優先級


  前兩篇博文中簡單整理了普通廣播,其實還有有序廣播,有序廣播在開發中也是比不可少的,可以給廣播接收者設定優先級來控制接受順序,並卻可以中斷廣播傳遞等等。

一、兩種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接收到了消息,廣播就被中斷了。日志如下:

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM