Android應用在未啓動的狀況下沒法收到指定廣播的問題總結

一 、問題現象 android

最近項目上碰見這樣一個需求,在程序安裝以後,若是收到特定廣播,須要程序作XXXX(具體的場景就不寫了),我當時想到的方案是在AndroidMainfest文件裏添加一個靜態註冊的廣播,好比:測試

 <receiver android:name=".receiver.XXXReceiver">.net

   <intent-filter>get

        <action android:name="XXX.XXX"/>io

   </intent-filter>ast

 </receiver> 程序

本覺得這樣就完事了,可是在測試過程當中發現若是程序曾經啓動過一次,那麼一切都正常,若是是新安裝應用,重來都沒啓動過,這個時候是收不到廣播的。。。。方法

2、問題分析 項目

我是以爲這個不是什麼多大的問題,可是測試妹子讓我解決,好吧,只好網上收一收答案,一查發現這是由於Android在3.1之後將新安裝的應用置爲「STOPPED」狀態,只有當應用啓動過一次以後這個狀態纔會改變。 至於這樣改的目的是什麼啦?這個就須要你們本身去考慮了。。filter

3、問題解決方法 

這個問題咱們須要修改兩個地方來解決, 

一、在靜態註冊廣播的時候 指定exported = true

<receiver android:name=".receiver.AddWidgetReceiver"

   android:exported="true">

   <intent-filter>

        <action android:name="XXX.XXX"/>

   </intent-filter>

 </receiver>

二、在發送intent的地方加上FLAG_INCLUDE_STOPPED_PACKAGES

Intent intent = new Intent();

intent.setAction("XXX.XXX");

intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);

sendBroadcast(intent);

緣由是從Android 3.1開始,系統給Intent定義了兩個新的Flag,分別爲FLAG_INCLUDE_STOPPED_PACKAGES(表示包含未啓動的App)和FLAG_EXCLUDE_STOPPED_PACKAGES(表示不包含未啓動的App),用來控制Intent是否要對處於中止狀態的App起做用

相關文章
相關標籤/搜索