android广播兼容8.0以及9.0高版本

问题

高版本发送广播收不到

分析

先看几遍文章
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);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值