您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Android中廣播消息機制的實踐是怎樣的,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
Android系統有一套廣播消息機制,方便進行每個應用程序之間的消息通知。而且廣播接受者作為Android四大組件之一,經常被使用到。我也接觸到廣播消息機制,因此有必要對自己所學的知識梳理整理下。
標準廣播
標準廣播是一種完全異步執行的廣播。這種廣播是一種一對多的廣播,效率比較高。當廣播被發出之后,所有的廣播接受者幾乎會在同一時間收到消息。
有序廣播
有序廣播是一種同步執行的廣播。這種廣播顧名思義是有接受順序的廣播。當廣播被發出之后,只有一個廣播接受者會收到消息。因此,該廣播是一對一的廣播。
動態注冊
通過Java代碼注冊。廣播接受者可以自由地對自己感興趣的廣播進行注冊,并內部處理響應廣播的邏輯。這種方式雖然靈活,當也有一定的局限性。它要求應用程序在運行時才能進行。
靜態注冊
在AndroidManifest.xml中注冊。這種方式可以在應用程序還沒有啟動就注冊接受廣播了。
動態注冊經典代碼
靜態注冊經典代碼
在AndroidManifest文件Application節點內添加如下代碼:
該廣播接受者名為MyBroadcastReceiver。其有兩個屬性:enabled屬性表示是否啟用這個廣播接受者;exported屬性表示是否允許這個廣播接受者接受本程序以外的廣播。
靜態注冊即使App退出,仍然能接收到廣播
動態注冊時,當Activity退出,就接收不到廣播了
但是靜態注冊即使App退出,仍然能接收到廣播這種說法自Android 3.1開始有可能不再成立。
說明
:
Android 3.1開始系統在Intent與廣播相關的flag增加了參數:
1) FLAG_INCLUDE_STOPPED_PACKAGES
:包含已經停止的包(停止:即包所在的進程已經退出)
2) FLAG_EXCLUDE_STOPPED_PACKAGES
:不包含已經停止的包
自Android3.1開始,系統本身增加了對所有App當前是否處于運行狀態的跟蹤。在發送廣播時,不管是什么廣播類型,系統默認直接增加了值為FLAG_EXCLUDE_STOPPED_PACKAGES
的flag,導致即使是靜態注冊的廣播接收器,對于其所在進程已經退出的App,同樣無法接收到廣播。
因此對于系統廣播,由于是系統內部直接發出的,無法更改此intent的flag值。因此,從3.1開始對于靜態注冊的接收系統廣播的BroadcastReceiver,如果App進程已經退出,將不能接收到廣播。
但是對于自定義的廣播,可以通過覆寫此flag為FLAG_INCLUDE_STOPPED_PACKAGES
,使得靜態注冊的BroadcastReceiver,即使所在App進程已經退出,也能接收到廣播,并會啟動應用進程,但此時的BroadcastReceiver是新建的。
實現代碼為:
在3.1以前,不少App可能通過靜態注冊方式監聽各種系統廣播,以此進行一些業務上的處理(如即使App已經退出,仍然能接收到,可以啟動service等..)。
3.1后,靜態注冊接受廣播方式的改變,將直接導致此類方案不再可行。于是,通過將Service與App本身設置成不同的進程已經成為實現此類需求的可行替代方案。
發送標準廣播
發送有序廣播
需要在AndroidManifest文件中通過設定廣播接受者的intent-filter節點的priority屬性來確定接受廣播的順序。
如果想把廣播截斷,可以在onReceive()
中調用abortBoradcast()
為了讓廣播只在應用程序中傳遞,這就需要LocalBroadcastManager大顯身手。我們通過代碼來熟悉。
0x06 廣播的最佳實踐
廣播可以應用于強制下線或者被擠下線的邏輯操作
上述就是小編為大家分享的Android中廣播消息機制的實踐是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。