這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Android中廣播消息機(jī)制的實踐是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
岳塘網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)建站2013年開創(chuàng)至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運(yùn)維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。
Android系統(tǒng)有一套廣播消息機(jī)制,方便進(jìn)行每個應(yīng)用程序之間的消息通知。而且廣播接受者作為Android四大組件之一,經(jīng)常被使用到。我也接觸到廣播消息機(jī)制,因此有必要對自己所學(xué)的知識梳理整理下。
標(biāo)準(zhǔn)廣播
標(biāo)準(zhǔn)廣播是一種完全異步執(zhí)行的廣播。這種廣播是一種一對多的廣播,效率比較高。當(dāng)廣播被發(fā)出之后,所有的廣播接受者幾乎會在同一時間收到消息。
有序廣播
有序廣播是一種同步執(zhí)行的廣播。這種廣播顧名思義是有接受順序的廣播。當(dāng)廣播被發(fā)出之后,只有一個廣播接受者會收到消息。因此,該廣播是一對一的廣播。
動態(tài)注冊
通過Java代碼注冊。廣播接受者可以自由地對自己感興趣的廣播進(jìn)行注冊,并內(nèi)部處理響應(yīng)廣播的邏輯。這種方式雖然靈活,當(dāng)也有一定的局限性。它要求應(yīng)用程序在運(yùn)行時才能進(jìn)行。
靜態(tài)注冊
在AndroidManifest.xml中注冊。這種方式可以在應(yīng)用程序還沒有啟動就注冊接受廣播了。
動態(tài)注冊經(jīng)典代碼
靜態(tài)注冊經(jīng)典代碼
在AndroidManifest文件Application節(jié)點(diǎn)內(nèi)添加如下代碼:
該廣播接受者名為MyBroadcastReceiver。其有兩個屬性:enabled屬性表示是否啟用這個廣播接受者;exported屬性表示是否允許這個廣播接受者接受本程序以外的廣播。
靜態(tài)注冊即使App退出,仍然能接收到廣播
動態(tài)注冊時,當(dāng)Activity退出,就接收不到廣播了
但是靜態(tài)注冊即使App退出,仍然能接收到廣播這種說法自Android 3.1開始有可能不再成立。
說明
:
Android 3.1開始系統(tǒng)在Intent與廣播相關(guān)的flag增加了參數(shù):
1) FLAG_INCLUDE_STOPPED_PACKAGES
:包含已經(jīng)停止的包(停止:即包所在的進(jìn)程已經(jīng)退出)
2) FLAG_EXCLUDE_STOPPED_PACKAGES
:不包含已經(jīng)停止的包
自Android3.1開始,系統(tǒng)本身增加了對所有App當(dāng)前是否處于運(yùn)行狀態(tài)的跟蹤。在發(fā)送廣播時,不管是什么廣播類型,系統(tǒng)默認(rèn)直接增加了值為FLAG_EXCLUDE_STOPPED_PACKAGES
的flag,導(dǎo)致即使是靜態(tài)注冊的廣播接收器,對于其所在進(jìn)程已經(jīng)退出的App,同樣無法接收到廣播。
因此對于系統(tǒng)廣播,由于是系統(tǒng)內(nèi)部直接發(fā)出的,無法更改此intent的flag值。因此,從3.1開始對于靜態(tài)注冊的接收系統(tǒng)廣播的BroadcastReceiver,如果App進(jìn)程已經(jīng)退出,將不能接收到廣播。
但是對于自定義的廣播,可以通過覆寫此flag為FLAG_INCLUDE_STOPPED_PACKAGES
,使得靜態(tài)注冊的BroadcastReceiver,即使所在App進(jìn)程已經(jīng)退出,也能接收到廣播,并會啟動應(yīng)用進(jìn)程,但此時的BroadcastReceiver是新建的。
實現(xiàn)代碼為:
在3.1以前,不少App可能通過靜態(tài)注冊方式監(jiān)聽各種系統(tǒng)廣播,以此進(jìn)行一些業(yè)務(wù)上的處理(如即使App已經(jīng)退出,仍然能接收到,可以啟動service等..)。
3.1后,靜態(tài)注冊接受廣播方式的改變,將直接導(dǎo)致此類方案不再可行。于是,通過將Service與App本身設(shè)置成不同的進(jìn)程已經(jīng)成為實現(xiàn)此類需求的可行替代方案。
發(fā)送標(biāo)準(zhǔn)廣播
發(fā)送有序廣播
需要在AndroidManifest文件中通過設(shè)定廣播接受者的intent-filter節(jié)點(diǎn)的priority屬性來確定接受廣播的順序。
如果想把廣播截斷,可以在onReceive()
中調(diào)用abortBoradcast()
為了讓廣播只在應(yīng)用程序中傳遞,這就需要LocalBroadcastManager大顯身手。我們通過代碼來熟悉。
0x06 廣播的最佳實踐
廣播可以應(yīng)用于強(qiáng)制下線或者被擠下線的邏輯操作
上述就是小編為大家分享的Android中廣播消息機(jī)制的實踐是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。