1. 程式人生 > >Android 8.0對隱式廣播的進一步限制

Android 8.0對隱式廣播的進一步限制

專案targetSdkVersion升級到26後,對應的的是Android O版本,即Android 8.0系統。經測試發現針對8.0及以上安卓版本手機,AndroidMainfest.xml中靜態註冊的廣播接收器失效,當App中對應intent filter型別廣播發出時,廣播接收器中的onReceive方法並未被系統回撥。   且在Android Studio Logcat中,出現如下所示錯誤資訊提示:

2018-12-20 17:34:55.588 749-767/system_process W/BroadcastQueue: Background execution not allowed: receiving Intent { act=com.corn.ui.setting.Action.TEST_BROADCAST flg=0x10 } to com.corn/.biz.setting.CornTestBroadcastReceiver
  核查Android官方文件,Android 8.0系統,對後臺執行有進一步限制,包括對隱式廣播的限制。 對應官方文件:https://developer.android.com/about/versions/oreo/background

對應Logcat中資訊,搜尋Android framework原始碼,按Logcat中的日誌關鍵詞搜尋到對應程式碼位置。 這裡推薦使用 http://androidxref.com/ 可以選定Andrid版本,以及對應原始碼專案等搜尋項搜尋。     上圖else if中條件,與官方文件闡述一致,想要廣播發送繼續生效,可以使此條件不滿足即可。
對應的,一般可以指定對應的廣播接收器Component,或對應的廣播接收器包名。 對應intent,常用的具體方法可以是:intent.setClass()或intent.setComponent()或intent.setPackage()等寫法   進一步,官方文件中指出了ACTION_PACKAGE_REPLACED 就是一種隱式廣播,而ACTION_MY_PACKAGE_REPLACED 則為顯式廣播,可以通過搜尋程式碼進一步核實下,看看基本寫法是否與上述邏輯一致。  
  可見,原始碼中寫法與上述分析一致。