Android 廣播機制以及用法詳解 (轉)


轉:http://blog.sina.com.cn/s/blog_5da93c8f010178zl.html

 
一、什么是廣播?
 
在android里面有各種各樣的廣播,比如電池的使用狀態,電話的接受和短信的接受都會產生一個廣播,應用程序也可以接受廣播並做出程序邏輯上的處理。
 
二、廣播的類型
 
BroadcastReceiver 所對應的廣播分兩類: 普通廣播有序廣播
 
1、普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結果傳遞給下一個接收者,並且無法終止廣播Intent的傳播。
 
普通廣播 通過 Context.sendBroadcast() 方法來發送, 所有的receivers接收器接收broadcast的順序不確定。 這種方式效率更高,但是BroadcastReceiver 無法使用 setResult系列 getResult系列 abort系列API。
 
2、有序廣播是按照接收者聲明的優先級別,被接收者依次接收廣播。如:A的級別高於B,B的級別高於C,那么廣播先傳給A,再傳給B,最后傳給C 。優先級別聲明在 intent-filter 元素的android:priority 屬性中,數越大優先級別越高。
可以通過在intent-filter中設置android:priority屬性來設置receiver的優先級,優先級相同的receiver其執行順序不確定。如果BroadcastReceiver是代碼中注冊的話,且其intent-filter擁有相同android:priority屬性 的話,先注冊的將先收到廣播。

 

有序廣播的接收者可以終止廣播Intent的傳播,廣播Intent的傳播一旦終止,后面的接收者就無法接收到廣播。
 
有序廣播 是通過 Context.sendOrderedBroadcast 來發送,所有的receiver依次執行。系統會根據接收者聲明的優先級別按順序逐個執行接收者,前面的接收者有權終止廣播(BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,后面的接收者就再也無法獲取到廣播。
對於有序廣播,前面的接收者可以將數據通過setResultExtras(Bundle)方法存放進結果對象,然后傳給下一個接收者,下一個接收者通過代碼:
Bundle bundle = getResultExtras(true))
可以獲取上一個接收者存入在結果對象中的數據。
 

這里接收短信的廣播是有序廣播,因此可以設置你自己的廣播接收器的級別高於系統原來的級別,就可以攔截短信,並且不存收件箱,也不會有來信提示音。

實現方法是:

 

<receiver android:name=".SmsReceiver" >
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
</intent-filter>
</receiver>

里面的android:priority="2147483647",就是設定廣播接收器的級別,intent-filter 標簽中的 priority 是設置廣播接收器的優先級,網上很多資料都表示,優先級的設置數值為1000~-1000,1000最大,但事實上,當 priority 值為integer 的最大值才時,才是優先級最高的,即  2147483647;當然,“最高”只是限於靜態注冊。

 

 兩種注冊BroadcastReceiver的方法:

  1.在應用程序的代碼中進行注冊
  
 注冊:BroadcastReceiver

    IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");   

    filter.setPriority(2147483647);

   receiver=new BroadReceiver();

   registerReceiver(receiver,filter);
  

  取消注冊BroadcastReceiver
    unregisterReceiver(receiver);

  2.在AndroidManifest.xml當中進行注冊

   <receiver android:name="SMSReceiver">
    <intent-filter android:priority="2147483647" >
     <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
   </receiver>


免責聲明!

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



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