最近把自己的手机系统升级到了android 8.0,然后以前能正常运行的项目,莫名其妙的出了问题,有个地方广播接收不到了,然后分别在6.0和7.0的设备上运行了项目,发现一切正常,擦,估计是高版本系统的问题,又要适配,不过,在调试程序时,在打印出的日志里面发现了这句话:
Background execution not allowed: receiving Intent { act=izis_MinaPushServiceOpen_kyteach flg=0x10 (has extras) } to cn.izis.kyteach/.receiver.DataReceiverPublic
后来在网上查了 android8.0及以上系统关于广播的规定:发现果然是对隐式广播做了限定,如果targetSdkVersion >=26,在Manifest里面注册的Receiver可能无法接收到广播消息(我的广播接收者就是像这样静态注册的):
<receiver android:name=".receiver.DataReceiverPublic">
<intent-filter>
<action android:name="izis_MinaPushServiceOpen_kyteach" />
</intent-filter>
</receiver>
但是因为这个静态广播涉及的代码和逻辑比较多,所以完全改成动态注册的方式,还是有点繁琐的,后来查阅相关资料,还是有解决办法的,加上后面这段代码:
if(Build.VERSION.SDK_INT >= 26){
ComponentName componentName=new ComponentName(getApplicationContext(),"cn.izis.kyteach.receiver.DataReceiverPublic");//参数1-包名 参数2-广播接收者所在的路径名
myIntent.setComponent(componentName);
}
但是如果是在2个不同的包之间发送广播,这句话是没用的,而是需要加上后面这段代码:
if(Build.VERSION.SDK_INT >= 26){
myIntent.addFlags(0x01000000);//加上这句话,可以解决在android8.0系统以上2个module之间发送广播接收不到的问题}
哈哈,又可以正常的接收广播了!!