Android 8.0对隐式广播的进一步限制

560 阅读1分钟

项目targetSdkVersion升级到26后,对应的的是Android O版本,即Android8.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系统,对后台执行有进一步限制,包括对隐式广播的限制。
对应官方文档:developer.android.com/about/versi…

官方文档

对应Logcat中信息,搜索Android framework源码,按Logcat中的日志关键词搜索到对应代码位置。 这里推荐使用:androidxref.com/ 可以选定Andrid版本,以及对应源码项目等搜索项搜索。

源码

上图else if中条件,与官方文档阐述一致,想要广播发送继续生效,可以使此条件不满足即可。 对应的,一般可以指定对应的广播接收器Component,或对应的广播接收器包名。
对应intent,常用的具体方法可以是:intent.setClass()或intent.setComponent()或intent.setPackage()等写法。

进一步,官方文档中指出了ACTION_PACKAGE_REPLACED 就是一种隐式广播,而ACTION_MY_PACKAGE_REPLACED 则为显式广播,可以通过搜索代码进一步核实下,看看基本写法是否与上述逻辑一致。

源码
源码

可见,源码中写法与上述分析一致。