之前的部落格中分析過android廣播機制相關的原始碼。
我們知道,如果僅將廣播分類為有序廣播和無序廣播,
那麼二者最大的區別在於:
android系統(ams)向乙個廣播接收器傳送無序廣播時,
並不需要等待該廣播接收器返回結果,就會繼續向下乙個廣播接收器傳送廣播。
因此,無序廣播可近似地看作同步傳送到所有的廣播接收器。
但是,當android系統傳送有序廣播時,將會等待前乙個廣播接收器返回結果後(除非處理超時),
才會繼續傳送向下乙個廣播接收器傳送廣播。
因此,有序廣播將會按照先後順序,依次遞交給每個廣播接收器。
根據有序廣播傳送的特點,前乙個廣播接收器可以向後乙個廣播接收器傳遞訊息。
例如,假設有如下場景:
後台服務完成一些業務後,需要決定是否彈出乙個通知欄。
如果判斷應用沒有在前台執行,就彈出通知欄;否則,就不彈出通知欄。
這個需求有很多種實現方式,我們僅以此場景為例,
看看如果使用有序廣播的話,如何來解決這個問題。
//假設後台服務完成業務,呼叫該介面傳送通知
private
void
showbackgroundnotification(int requestcode, notification notification)
現在,在前台的fragment中動態註冊乙個廣播接收器:
public
class
visiblefragment
extends
fragment
//fragment離開前台時,就反註冊廣播接收器
@override
public
void
onstop()
private broadcastreceiver monshownotification = new broadcastreceiver()
};..............
}
從上面的**我們知道,當應用在前台時,就會收到後台傳送的有序廣播,然後修改廣播攜帶的result code。
然後,我們再定義乙個靜態廣播接收器:
中的定義
......
......
".receiver.notificationreceiver"
//外部應用無法傳送訊息給該broadcastreceiver
android:exported=
"false"
>
//指定其優先順序最低,確保其最後收到有序廣播
//實際上,從之前部落格分析的原始碼來看,廣播本來就會先傳送給動態註冊的接收器,其次才會傳送給靜態廣播接收器
"-999"
>
"stark.a.is.zhang.photogallery.show_notification"
/>
>
......
......
在該靜態廣播接收器的實現**中:
public
class
notificationreceiver
extends
broadcastreceiver
int requestcode = = intent.getintextra(jobpollservice.request_code, 0);
notification notification = intent.getparcelableextra(jobpollservice.notification);
notificationmanagercompat notificationmanager = notificationmanagercompat.from(context);
notificationmanager.notify(requestcode, notification);
}}
靜態廣播接收器在傳送通知前,先判斷廣播攜帶的result code是否滿足條件。
根據上文的**容易看出,如果應用在前台,那麼動態註冊的廣播接收器將會先收到有序廣播,
並修改其中的result code,於是靜態廣播接收器收到廣播後,就不會彈出通知;
反之,如果應用不在前台,那麼靜態廣播接收器收到廣播時,其攜帶的result code與初始時一致,
就會彈出通知欄。
以上案例僅作為靜態廣播的使用示例,實際上靜態廣播還可以攜帶一些其它的資料,
具體使用方式,可以參考對應的api。
Android中有序廣播和無序廣播
broadcastreceiver所對應的廣播分兩類 有序廣播和無序廣播。無序廣播 通過context.sendbroadcast 方法來傳送,它是完全非同步的。所有的receivers 接收器 的執行順序不確定,因此所有的receivers 接收器 接收broadcast的順序不確定。這種方式效率...
Android全域性廣播(無序,有序)
寫這篇文章的原因 最近博主在帶兩個小白學android,在教廣播的過程中發現了一些問題 大概如下 1.android8.0以上廣播需要動態註冊 靜態註冊無效 2.android8.0以上兩個應用間按照以前的操作傳送廣播後在另乙個沒辦法接收到廣播的情況 3.出現了廣播接收者的搶先或重複問題 在文章最後...
Android自定義傳送有序廣播
有序廣播,是一種同步執行的廣播,在廣播發出之後,同一時刻只會有乙個廣播接收者能夠收到這條廣播訊息,當著個廣播接收者中的邏輯執行完畢後,廣播才回機繼續傳遞。所以此時額廣播接收者是有先後順序的,優先順序高的廣播接收者就可以先收到廣播訊息,並且前面的廣播接收者還可截斷正在傳遞的廣播,這樣後面的廣播接收者就...