一、問題現象
在進行android開發的時候,有多種方式和第三方應用進行通訊,常見的有aidl、service、receiver、content provider等,這不,最近為了省事使用了廣播和第三方應用進行通訊,但是發現乙個問題,對方偶發收不到廣播,開始懷疑對方是不是動態註冊了廣播,和對方的開發確認是靜態註冊(也就是在manifest檔案中註冊),這種方式應該不會有什麼問題的,經過多次測試發現問題的出現有個規律:註冊廣播的應用在首次安裝從未啟動的情況下是收不到廣播的(如果是覆蓋安裝也是可以收到廣播),既然找到的問題出現的場景就好查到問題的原因了。
二、問題原因
經過查詢網上的資料和原始碼,發現在android3.1之後,首次安裝從未啟動過的應用,系統會預設乙個標誌stoped,當系統有某個應用傳送廣播的時候,會進行選擇性過濾(也就是那些狀態為stopped的應用不會收到廣播)
三、解決方法
既然查到了原因,那怎麼解決呢,針對以上原因有三種方法:
1、在傳送廣播的時候增加乙個flag(不是所有的rom都支援):
在註冊廣播的時候新增action,同時設定android:exported=「true」;
2、修改協議,不要使用廣播,使用service代替就挺好
3、 傳送之前先判斷對方程序是否存在,不存在先拉起在發廣播,此方案和方案2有重複,拉起的邏輯也夠傳送訊息了
綜上,建議如果出現這個問題,建議更改協議最保險(方案二)
Android中不能靜態註冊的廣播
android中不能靜態註冊的廣播有 android.intent.action.screen on android.intent.action.screen off android.intent.action.battery changed android.intent.action.config...
廣播機制 靜態註冊
動態註冊的廣播接收器可以自由的控制註冊與登出,在靈活方面有很大的優勢,但是,它也存在著乙個缺點,就是必須要在程式啟動後才能夠接收到廣播,因為註冊的邏輯是寫在oncreate 裡的。那麼,有什麼方法可以讓程式在未啟動的情況下就能接收到廣播那?這就需要靜態註冊 xmlns android android...
廣播的動態靜態註冊
原文 兩者及其接收廣播的區別 1.動態註冊的廣播 永遠要快於 靜態註冊的廣播,不管靜態註冊的優先順序設定的多高,不管動態註冊的優先順序有多低 2.動態註冊廣播不是 常駐型廣播 也就是說廣播跟隨activity的生命週期。注意 在activity結束前,移除廣播接收器。靜態註冊是常駐型 也就是說當應用...