问题
高版本发送广播收不到
分析
先看几遍文章
https://blog.csdn.net/qq_30711091/article/details/86657268
https://blog.csdn.net/u014800750/article/details/79558680
https://blog.csdn.net/sytandxly/article/details/81061542
https://www.jianshu.com/p/5283ebc225d5?utm_source=oschina-app
https://juejin.im/post/5aefd27f6fb9a07ab45889cc
https://blog.csdn.net/u011386173/article/details/82889275
总结
1、高版本时候,注册广播采用动态注册
2、系统广播的发送和接收
//1 动态注册
private LocalReceiver receiver;
private void registerReceiver() {
receiver = new LocalReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
context..registerReceiver(receiver, intentFilter);
}
//2 收广播
public class LocalReceiver extends BroadcastReceiver {
public static final String notaction = LocalReceiver.class.getName();
@Override
public void onReceive(Context context, Intent intent) {
try {
if (intent != null &&
"android.net.conn.CONNECTIVITY_CHANGE".equals(intent.getAction())
) {
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//3 发广播
Intent intent = new Intent();
intent.setAction(LocalReceiver.notaction);
//intent.setClass(context, LocalReceiver.class);
intent.setComponent(
new ComponentName(context.getPackageName(),
LocalReceiver.class.getName()) );
// intent.addFlags(0x01000000);
// intent.addFlags(FLAG_INCLUDE_STOPPED_PACKAGES);
context.sendBroadcast(intent);
//4 取消注册
context.unregisterReceiver(receiver);
2、自定义广播的发送和接收
//1 注册
private LocalReceiver receiver;
private void registerReceiver() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(LocalReceiver.notaction);
receiver = new LocalReceiver();
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getApplicationContext());
//注册本地接收器
manager.registerReceiver(receiver, intentFilter);
}
}
//2 发送
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context);
Intent intent = new Intent(LocalReceiver.notaction);
manager.sendBroadcast(intent);
//3 接收
public class LocalReceiver extends BroadcastReceiver {
public static final String notaction = LocalReceiver.class.getName();
@Override
public void onReceive(Context context, Intent intent) {
try {
if (intent != null && (LocalReceiver.notaction.equals(intent.getAction())
)) {
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//4 注销
private void unregisterReceiver() {
try {
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getApplicationContext());
manager.unregisterReceiver(receiver);
} catch (Exception e) {
e.printStackTrace();
}
}
命令
adb命令可以模拟发送广播
adb shell am broadcast -a com.test.demo.reciver.LocalReceiver -n com.test.demo.reciver/com.test.demo.reciver.LocalReceiver
//action是com.test.demo.reciver.LocalReceiver
//com.test.demo.reciver是包名
//com.test.demo.reciver.LocalReceiver是对应的Receiver
//测试发现静态广播有效、动态广播这么发送无效
//在app中也不是没有权限直接发送系统广播的,举例子
// Intent intent2 = new Intent();
// //发送本地广播
manager.sendBroadcast(intent);
// intent2.setPackage(context.getPackageName());
// intent2.setAction("android.net.conn.CONNECTIVITY_CHANGE");
// intent2.setComponent( new ComponentName( context.getPackageName(),LocalReceiver.class.getName()) );
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.net.conn.CONNECTIVITY_CHANGE from pid=21989, uid=11573
// context.sendBroadcast(intent2);