项目 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 系统, 对后台执行有进一步限制, 包括对隐式广播的限制.
对应官方文档:
对应 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 则为显式广播, 可以通过搜索代码进一步核实下, 看看基本写法是否与上述逻辑一致.
可见, 源码中写法与上述分析一致.
来源: https://www.cnblogs.com/lwbqqyumidi/p/10151914.html