前言
学习四大组件中的广播时,自定义广播一直接收不到,然后发现了在 Android 8.0 以上的系统对静态广播做出了限制(本地广播不受影响)
对于这个,Google 开发者文档是这样说的:
然后就开始了踩坑和从坑里爬起来的过程…
解决办法
-
使用动态广播代替原来的静态广播(官方建议)
-
在 intent 发送前加上相应的包名
直接声明包名,将隐式广播变为显式广播,就正常在清单中进行注册了
Intent intent = new Intent("com.lsilencej.broadcasttest.MY_BROADCAST"); intent.setPackage(getPackageName()); sendBroadcast(intent, null);
-
给 intent 添加 Component 参数
Component 第一个参数为包名,第二个参数为广播接收器的绝对路径
Intent intent = new Intent("com.lsilencej.broadcasttest.MY_BROADCAST"); intent.setComponent(new ComponentName(getPackageName(), "com.lsilencej.broadcasttest.MyBroadcastReceiver"));
-
如果要发送有序广播,则可以给 intent 加上一个 flag
Intent intent = new Intent("com.lsilencej.broadcasttest.MY_BROADCAST"); intent.addFlags(0x01000000);
为什么是这个 flag?详见:在Android8.0上突破隐式广播的限制
总结
最好还是使用动态广播(谷歌为了保护用户隐私的操作)
可以采用如下方法来发送有序广播
Intent intent = new Intent("com.lsilencej.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent, null);