broadcastreceiver所對應的廣播分兩類:
有序廣播和無序廣播。
無序廣播:通過context.sendbroadcast()方法來傳送,它是完全非同步的。
所有的receivers(接收器)的執行順序不確定,因此所有的receivers(接收器)接收broadcast的順序不確定。
這種方式效率更高,但是broadcastreceiver無法使用setresult系列、getresult系列及abort(中止)系列api
有序廣播:是通過context.sendorderedbroadcast來傳送,所有的receiver依次執行。
broadcastreceiver
可以使用
setresult系列函式
來結果傳給下乙個
broadcastreceiver
,通過getresult系列函式
來取得上個
broadcastreceiver
返回的結果,並可以
abort系列函式
來讓系統丟棄該廣播,使用該廣播不再傳送到別的broadcastreceiver。
可以通過在intent-filter中設定android:priority屬性來設定receiver的優先順序,優先順序相同的receiver其執行順序不確定。
如果broadcastreceiver是**中註冊的話,且其intent-filter擁有相同android:priority
屬性的話,先註冊的將先收到廣播。
有序廣播,即從優先級別最高的廣播接收器開始接收,接收完了如果沒有丟棄,就下傳給下乙個次高優先順序別的廣播接收器進行處理,依次類推,直到最後。如果多個應用程式設定的優先級別相同,則誰先註冊的廣播,誰就可以優先接收到廣播。
這裡接收簡訊的廣播是有序廣播,因此可以設定你自己的廣播接收器的級別高於系統原來的級別,就可以攔截簡訊,並且不存收件箱,也不會有來信提示音。
實現方法是:
<
receiver
android:name
=".smsreceiver"
>
<
intent-filter
android:priority
="100"
>
<
action
android:name
="android.provider.telephony.sms_received"
/>
intent-filter
>
receiver
>
裡面的android:priority="100"就是設定廣播接收器的級別,這個值從1000~-1000,數值越大,優先級別就越高。
同一優先順序的廣播接收器,動態的要比靜態註冊的早。
動態註冊:即由**註冊的廣播接收器靜態註冊:即在 androidmanifest.xml 中註冊的廣播接收器 優先順序: 當廣播為有序傳送的時候,要按這個排序並順序傳送。 sendbroadcast 傳送的是無序廣播。sendorderedbroadcast 傳送的是有序廣播。
請參照原始碼再做研究。
有序廣播和無序廣播
有序廣播可以指定廣播接收者的順序,無序廣播是大家一起接收匹配到的進行操作就行。有序廣播可以中斷,sendorderedbroadcast 無序廣播不可以中斷 sendbroadcast intent 用 示例說明 param view 傳送無序廣播的按鈕的功能 public void sendbro...
Android全域性廣播(無序,有序)
寫這篇文章的原因 最近博主在帶兩個小白學android,在教廣播的過程中發現了一些問題 大概如下 1.android8.0以上廣播需要動態註冊 靜態註冊無效 2.android8.0以上兩個應用間按照以前的操作傳送廣播後在另乙個沒辦法接收到廣播的情況 3.出現了廣播接收者的搶先或重複問題 在文章最後...
有序廣播和無序廣播的區別
1.無序廣播 通過context.sendbroadcast 方法來傳送,它是完全非同步的。所有的receivers 接收器 的執行順序不確定,因此所有的receivers 接收器 接收broadcast的順序不確定。這種方式效率更高,但是broadcastreceiver無法使用setresult...