一 、問題現象 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起做用