第一行代码学习笔记:关于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);
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值