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

來源:互聯網
上載者:User

標籤:

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

參考:http://blog.sina.com.cn/s/blog_80723de801014e2g.htmlhttp://blog.csdn.net/jjaze3344/article/details/7259272 一、什麼是廣播? 在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>

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.