眾所周知有兩種方式去注冊BroadcastReceiver备恤,下面主要談?wù)勳o態(tài)注冊方式露泊。
先拋出問題:
- 我想要 即使我的APP退出后仍然可以接收到廣播,從而做我想做的事旅择。
- 我想要 我的APP一安裝就可以接收到廣播惭笑,不用非得啟動一下。
靜態(tài)方式注冊receiver生真,不就是解決上述問題的么沉噩?問動態(tài)注冊和靜態(tài)注冊的區(qū)別,我們毫不猶豫的就回答說靜態(tài)方式注冊在APP退成后仍然能接收到廣播柱蟀。但是事實真的是這樣么川蒙?
show me the code !
靜態(tài)注冊receiver
包名為cn.com.ada的ReceiverApp中通過靜態(tài)方式注冊了廣播接收者MyReceiver,監(jiān)聽action為cn.com.ada.test的廣播长已。
<receiver
android:name="cn.com.ada.MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="cn.com.ada.test"/>
</intent-filter>
</receiver>
發(fā)送廣播
包名為cn.com.ada1的SendApp中發(fā)送廣播畜眨。
Intent intent = new Intent("cn.com.ada.test");
sendBroadcast(intent);
測試發(fā)現(xiàn):
- 當(dāng)初次安裝后,如果不啟動ReceiverApp术瓮,是收不到廣播的康聂。
- 在設(shè)置應(yīng)用管理中的應(yīng)用詳情頁點擊強制停止或者
使用 adb shell am force-stop package-name命令停止ReceiverApp后,也是收不到廣播的胞四。
這是因為
從 Android 3.1 開始蕊连,系統(tǒng)為所有的廣播都默認添加了FLAG_EXCLUDE_STOPPED_PACKAGES 標志。所有處于停止狀態(tài)的應(yīng)用將無法接受到該標志的廣播。注意囚聚,只有兩種情況下應(yīng)用才會處于停止狀態(tài):
- 應(yīng)用安裝后未運行
- 應(yīng)用被手動(設(shè)置-應(yīng)用-強制停止)或者被其他應(yīng)用強制停止了
如果需要啟動處于停止狀態(tài)的應(yīng)用,則只要為Intent添加FLAG_INCLUDE_STOPPED_PACKAGES 標記即可星压。
Intent intent = new Intent("cn.com.ada.test");
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
sendBroadcast(intent);
這樣才算真正實現(xiàn)了靜態(tài)注冊receiver优质,程序退出后仍然可以接收廣播演怎。
TODO
測試中發(fā)現(xiàn)一個問題淑际,ReceiverApp運行時崩潰春缕,彈出“ReceiverApp停止運行”的提示框女阀,這時點擊確定后,依然可以接收廣播惫确。但是,有時不會彈出提示框直接閃退揍鸟,這時就接收不到廣播了前翎。不知是何原因港华?