Android 8.0 以上无法接收静态广播的解决办法

技术学习 / 2022-01-13

前言

学习四大组件中的广播时,自定义广播一直接收不到,然后发现了在 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);