Android四大组件之BroadcastReceiver


BroadcastReceiver广播接收者的意思,既然是接收者,那就肯定有发送者,发送者其实就是android系统,我们开发者使用BroadcastReceiver就能接收到系统发送出来的广播。比如,手机开机会发出一个广播,开启屏幕会发出一个广播,息屏会发出一个广播,来电话,打电话,来短信,发送短信,等等这些都会发送一个广播,我们都可以使用BroadcastReceiver来接收,然后根据业务需求在接收到这些广播之后做一些操作。

广播注册

注册广播有两种方式
静态注册:在清单文件配置intent-filterr—>意图过滤器
动态注册:在代码中调用registerReceiver注册

接收系统广播

  1. 定义一个类AppStateReceiver,继承BroadcastReceiver
  2. 在Application中或者Activity中动态注册广播接收者
  3. 在自定义的广播接收者类的onReceive方法中接收数据
    例如注册一个监听应用程序安装和下载的广播接收者
    第一步
public class AppStateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("AppStateReceiver","接收到广播了");
        String action = intent.getAction();
        Uri data = intent.getData();
        if ("android.intent.action.PACKAGE_INSTALL".equals(action)){
            Log.d("AppStateReceiver","应用安装:INSTALL"+data);
        }else if("android.intent.action.PACKAGE_ADDED".equals(action)){
            Log.d("AppStateReceiver","应用安装:ADDED"+data);
        }else if("android.intent.action.PACKAGE_REMOVED".equals(action)){
            Log.d("AppStateReceiver","应用卸载:REMOVED"+data);
        }
    }
}

第二步

 AppStateReceiver appStateReceiver = new AppStateReceiver();
        IntentFilter appStateIntentFilter = new IntentFilter();
        appStateIntentFilter.addAction("android.intent.action.PACKAGE_INSTALL");//这个没用,
        appStateIntentFilter.addAction("android.intent.action.PACKAGE_ADDED");//安装
        appStateIntentFilter.addAction("android.intent.action.PACKAGE_REMOVED");//卸载
        appStateIntentFilter.addAction("android.intent.action.PACKAGE_REPLACED");//新版本
        appStateIntentFilter.addDataScheme("package");
        registerReceiver(appStateReceiver,appStateIntentFilter);

接收自定义无序广播

接收自定义广播和接收系统广播一样,区别就是action是自定义的
第一步定义一个自定义广播接收者

public class CustomReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String sendReceive = intent.getStringExtra("sendReceive");
        Log.d("CustomReceiver",sendReceive);
    }
}

第二步注册广播

 // 1. 实例化BroadcastReceiver子类 &  IntentFilter
        CustomReceiver customReceiver = new CustomReceiver();
        IntentFilter intentFilter = new IntentFilter();
        // 2. 设置接收广播的类型
        intentFilter.addAction("com.longteng.cn");// 只有持有相同的action的接受者才能接收此广播
        // 3. 动态注册:调用Context的registerReceiver()方法
        registerReceiver(customReceiver, intentFilter);

第三步创建一个新的应用发送广播
创建一个应用,写一个点击事件,执行下面的方法就行了

    public void sendReceive(View view) {
        Intent intent = new Intent();
        intent.setAction("com.longteng.cn");
        intent.putExtra("sendReceive","发送无序广播");
        //下面这行是指定发送到哪个包名,如果是静态注册的广播接收者,就需要指定包名
//        intent.setPackage("com.longteng.learndemo");
        sendBroadcast(intent);
        Log.d("sendReceive","点击了发送广播");
    }

接收自定义有序广播

有序广播是指,一个应用接收多次同一个广播可以按照一定的级别顺序接收广播。

  1. 需要发送一个有序广播
  2. 多个广播接收者,级别不同
    下面是具体实现
    发送广播代码
Intent intent = new Intent();
        intent.setAction("com.longteng.orderReceive");
        // 第一个参数Intent类型,就是意图
        // 第二个参数String,设置一个权限
        // 第三个参数BroadcastReceiver类型,
        // 是一个最终的广播接收者,就是指定最后一个收到广播的,
        // 这个这个广播接收者就不需要注册了
        // 并且这个广播接收者不管中间是否有被终止操作,都能收到数据
        // 第四个参数Handler类型
        // 第五个参数int类型,设置一个初始码
        // 第六个参数String类型,设置一个初始数据
        // 第七个参数Bundle类型
//        sendOrderedBroadcast(intent,null,null,null,1,"initialData100",null);
        sendOrderedBroadcast(intent,null,new FinalReceive(),null,1,"initialData100",null);

发送广播的时候第三个参数可以指定一个最终的广播接收者,也可以不指定,我这里就是定义了一个最简单的广播接收者

public class FinalReceive extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(this.getClass().getName(),getResultData());
    }
}

发送就完成了,下面看接收,我定义了三个接收广播的类

public class AcceptOrderReceiveFirst extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //打印接收到的数据
        Log.d(this.getClass().getName(),getResultData());
        //修改数据
        setResultData("first->update->initialData80");
    }
}
public class AcceptOrderReceiveMiddle extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(this.getClass().getName(),getResultData());
        //修改数据
        setResultData("middle->update->initialData60");
        //终止广播,但是不能终止发送广播时指定的广播接收者
        abortBroadcast();
    }
}
public class AcceptOrderReceiveFinal extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(this.getClass().getName(),getResultData());
    }
}

定义好三个广播接收者,完成动态注册就可以了

        //第一个收到的
        AcceptOrderReceiveFirst acceptOrderReceiveFirst = new AcceptOrderReceiveFirst();
        IntentFilter acceptFirstIntentFilter = new IntentFilter();
        //设置级别,数字越大越先收到,数字范围-1000至1000,官方写的范围
        acceptFirstIntentFilter.setPriority(1000);
        acceptFirstIntentFilter.addAction("com.longteng.orderReceive");
        registerReceiver(acceptOrderReceiveFirst,acceptFirstIntentFilter);
        //第二个收到的
        AcceptOrderReceiveMiddle middle = new AcceptOrderReceiveMiddle();
        IntentFilter acceptMiddleIntentFilter = new IntentFilter();
        acceptMiddleIntentFilter.setPriority(0);
        acceptMiddleIntentFilter.addAction("com.longteng.orderReceive");
        registerReceiver(middle,acceptMiddleIntentFilter);
        //最后一个收到的
        AcceptOrderReceiveFinal orderReceiveFinal = new AcceptOrderReceiveFinal();
        IntentFilter finalIntentFilter = new IntentFilter();
        finalIntentFilter.setPriority(-100);
        finalIntentFilter.addAction("com.longteng.orderReceive");
        registerReceiver(orderReceiveFinal,finalIntentFilter);

注销广播接收者

如果是在Activity中注册的广播接收者,可以在onDestroy里面注销广播接收者unregisterReceiver(BroadCastReceive receive)就可以了,可以防止广播泄漏。

广播接收者注意事项

  1. 如果是静态注册广播,发送广播的必须指定注册广播的应用的包名,这样静态注册的广播才能收到。
  2. 如果是动态注册广播,如果不是系统广播需要加权限的,基本都可以收到广播消息
  3. 所以推荐动态注册广播。
  4. 无序广播不能修改,不能终止
  5. 有序广播可以修改,可以终止

广播可以干什么

  1. 进程间通信,这个很明显,一个应用发送广播,另一个应用接收广播,这就是进程间通信
  2. 可以做一些顺序操作,因为有序广播可以指定顺序执行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值