- 首先是應用中不能只有一個廣播,必須有一個activity或者service(這種情況比較復雜參考http://www.cnblogs.com/welcoming/p/4120497.html)
簡單的小例子,一個是只有一個Receiver捕捉有網絡改變的常駐廣播,另外一個是在第一個的基礎上增加了一個Activity。試驗證明,第一種情況是收不到廣播的! 第二種情況是可以收到廣播的。所以android程序中,不能只有一個Receiver組件,必須還要Activity。據說這是google對android應用程序安全的考慮,防止流氓軟件潛水消耗資源,正所謂禁止潛水也!
- Android應用在未啟動的情況下無法收到指定廣播
一 、問題現象
最近項目上遇見這樣一個需求,在程序安裝之后,需要收到特定廣播,我當時想到的方案是在AndroidMainfest文件里添加一個靜態注冊的廣播,比如:
<receiver android:name=".receiver.XXXReceiver"> <intent-filter> <action android:name="XXX.XXX"/> </intent-filter> </receiver>
本以為這樣就完事了,但是在測試過程中發現如果程序曾經啟動過一次,那么一切都正常,如果是新安裝應用,重來都沒啟動過,這個時候是收不到廣播的。。。。
二、問題分析
我是覺得這個不是什么多大的問題,但是測試妹子讓我解決,好吧,只好網上收一收答案,一查發現這是因為Android在3.1以后將新安裝的應用置為“STOPPED”狀態,只有當應用啟動過一次之后這個狀態才會改變。 至於這樣改的目的是什么啦?這個就需要大家自己去考慮了。。
三、問題解決方法
這個問題我們需要修改兩個地方來解決,
1、在靜態注冊廣播的時候 指定exported = true
<receiver android:name=".receiver.AddWidgetReceiver"
android:exported="true">
<intent-filter>
<action android:name="XXX.XXX"/>
</intent-filter>
</receiver>
2、在發送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起作用。