高版本发送广播收不到
先看几遍文章 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);