Android無法收到指定廣播的問題總結


簡單的小例子,一個是只有一個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起作用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM