Android應用被強制停止后無法接受廣播解決方案


在3.1之后,系統的PackageManager增加了對處於“stopped state”應用的管理,這個stopped和Activity生命周期中的stop狀態是完全兩碼事,包管理器中的stopped state指的是安裝后從來沒有啟動過或者是被用戶手動強制停止的應用。這點大家可以到“設置”——>"應用程序",查看任何一個安裝的應用,看看“強行停止”這個按鈕是否變灰就知道了。

   系統增加了2個Flag:FLAG_INCLUDE_STOPPED_PACKAGESFLAG_EXCLUDE_STOPPED_PACKAGES ,來標識一個intent是否激活處於“stopped state”的應用。當2個Flag都不設置或者都進行設置的時候,采用的是FLAG_INCLUDE_STOPPED_PACKAGES的效果。有了上面的新機制之后,google覺得給所有的廣播intent默認加上FLAG_EXCLUDE_STOPPED_PACKAGES會非常的Cooooool,能在一定程度上避免流氓軟件、病毒啊干壞事,還能提高效率,就導致了RECEIVE_BOOT_COMPLETED廣播如果用戶沒有運行過應用或者在設置中強行停止了應用,就不會接收到BOOT_COMPLETED廣播。

 

在android3.1以后的版本中,如果程序被強制停止后應用狀態會被標記為STOPPED,此時應用無法收到其他應用的廣播,要等到應用再開啟一次,將STOPPED去掉以后才可以。除此之外還有一個解決方法如下:

解決辦法:

  在廣播發發送方發送廣播時需要設置Intent.FLAG_INCLUDE_STOPPED_PACKAGES

示例代碼:

Intent intent = new Intent();
intent.setAction("com.leeliwei.test.receiver.action.test");
if (android.os.Build.VERSION.SDK_INT >= 12) {
     intent.setFlags(32);//3.1以后的版本需要設置Intent.FLAG_INCLUDE_STOPPED_PACKAGES
}
sendBroadcast(intent);

參照代碼再多說兩句高低版本兼容問題,if判斷中為什么寫>=12而不是大於>= android.os.Build.VERSION_CODES.HONEYCOMB_MR1這種常量形式。答案是我的sdk兼容從2.2版本開始的,如果寫成常量形式的會報編譯錯誤,如果調高了targetVersion(開發綁定版本),雖然編譯沒有錯誤,但在低版本運行時,會因為找不到那個常量值兒報異常終止,所以建議使用數字12。同理,intent.setFlags(32)中沒有直接寫常量也是這個原因,Intent.FLAG_INCLUDE_STOPPED_PACKAGES是3.1版本時才有的。低版本會報錯。


免責聲明!

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



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