第一行代码学习笔记:关于BroadcastReceiver的实现方式
最近在学习郭霖大神的第一行代码第二版,在进行自定义广播部分的实例练习时发现点击按钮后未能接收到广播消息,经过代码排查和度娘查询才知道原来是8.0版本开始已经不支持大部分的静态注册广播了,然后结合网友们提供的方法并进行测试总结下:
方法1 动态注册
既然静态注册可能会导致实效,那么就只好在自己的程序内进行动态注册吧,这样总不会接收不到了:
private BroadcastReceiver myBroadcastReceiver;
if(null == myBroadcastReceiver){
myBroadcastReceiver = new AnotherBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.broadcasttest.MY_BROADCAST");
registerReceiver(myBroadcastReceiver, filter);
}
方法2 发送广播时设置intent.setComponent
这个方法倒是能在静态注册下收到广播呢,但是只限定于在ComponentName里设置的应用。。。呃,想多个应用都接收的话,多建几个Intent吧,呵呵。。。
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
// 兼容安卓8.0 参数为(应用包名,广播路径),但是只局限于特定的应用能收到广播
intent.setComponent(new ComponentName(getApplication().getPackageName(),
"com.example.broadcasttest.MyBroadcastReceiver"));
sendBroadcast(intent);
//想要另一个应用也接收,再建一个
Intent intent1 = new Intent("com.example.broadcasttest.MY_BROADCAST");
intent1.setComponent(new ComponentName("com.example.broadcasttest2",
"com.example.broadcasttest2.AnotherBroadcastReceiver"));
sendBroadcast(intent1);
方法3 发送广播时设置intent.addFlags
然后有网友提供了这个方法,虽然现在还不明白原理,亲测所有静态注册下的应用都能接收到广播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.setComponent(new ComponentName(getApplication().getPackageName(),
"com.example.broadcasttest.MyBroadcastReceiver"));
//突破限制,实现所有应用都可以收到广播
intent.addFlags(0x01000000);
sendBroadcast(intent);