这几天学习Receiver的时候,发现android 8.0之后对隐式注册的广播接收器做出了限制,除了一些例外情况,我试了几种情况总结下来,以防忘记.
使用sendBroadcast(intent)时
一:当intent直接指向一个具体广播接收器
如使用Intent的构造方法直接传递Context和Class或使用intent.setComponent或者setClass或setClassName
这种情况下,
查看源代码可知,实际上述构造方法和setClass,setClassName都是把接受到的参数去new一个ComponentName的实例
可能有人会疑惑传入的参数有的是字符串有的是Class有的是Context
查看ComponentName的构造方法代码,发现最终实际传入的都是传入的参数去获取包名和类名.
这个广播接收器不管动态注册或者静态注册,都可以接受到广播.
二:intent指向一个包
如使用intent.setPackage,这种情况下intent需要设置action参数,在该包下的广播接收器就会根据这个intent里面的action来接收(不管静态注册或是动态注册)
三:intent只设置action
这种情况只能使用动态注册registerReceiver来接收广播.正常情况静态注册的广播接收器接受不到.但是参考网上资料,有大佬说给intent添加FLAG_RECEIVER_INCLUDE_BACKGROUND的flag就能突破这种限制(intent.addFlags(0x01000000);)让静态注册的广播接收器也能接收到广播白名单外的广播文章来源:https://www.toymoban.com/news/detail-403142.html
参考Android 隐式广播 - 简书 (jianshu.com)文章来源地址https://www.toymoban.com/news/detail-403142.html
到了这里,关于sendBroadcast发送广播的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!