安卓核心组件四BroadCastReceiver

本文详细介绍了安卓中的广播机制,包括广播接收者BroadcastReceiver的创建、注册及使用方式,广播的发送流程,以及有序广播和普通广播的区别。文章还探讨了广播在开机启动应用中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安卓核心组件四BroadCastReceiver

  • 简介:BroadCastReceiver广播接收者,广播是一种通信机制,广播的发送方可以发出广播,而另一端可以使用接收者接收该广播,接收到了以后决定相应的处理。
  • 广播的接收:广播的接收需要自定义类继承BroadcastReceiver来实现,该自定义类可以是内部类

    private class InnerBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if("cn.myapp.player.intent.action.PLAY".equals(action)) {
            // PLAY
            Log.d("media store", "PlayMusicService$InnerBroadcastReceiver.onReceive() -> PLAY");
        } else if("cn.myapp.player.intent.action.PREVIOUS".equals(action)) {
            // PREVIOUS
            Log.d("media store", "PlayMusicService$InnerBroadcastReceiver.onReceive() -> PREVIOUS");
        }

    }

}

这是一个广播接收者的内部类,在接收到广播以后就会执行这段代码,请注意ANR问题,如果广播的处理时间超过10s(不是5s),那么就会产生ANR问题,所以耗时操作请放在子线程中运行,运行完毕后通过message通知主线程。

- 广播的注册:作为核心组件,使用的话都是需要注册的,但是广播的注册和其他程序的注册不同,在AndroidManifest.xml注册仅仅是一种方式,另外还可以在代码中动态的进行注册。调用registerReceiver(BroadcastReceiver recevier, IntentFilter filter)即可实现注册,注册时,参数IntentFilter中应该通过addAction()方法添加所有需要接收的广播中Intent携带的Action属性。请看以下代码:

        // 注册广播接收者
    BroadcastReceiver receiver = new InnerBroadcastReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction("cn.myapp.player.intent.action.PLAY");
    filter.addAction("cn.myapp.player.intent.action.PREVIOUS");
    registerReceiver(receiver, filter);

注意一下Action属性可以存在多个,只要符合其中一个就可以接收到。

- 广播的发送,发送很简单

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.ib_play_or_pause:
        Intent intent = new Intent();
        intent.setAction("cn.myapp.player.intent.action.PLAY");
        sendBroadcast(intent);
        break;
    case R.id.ib_previous:
        Intent it = new Intent();
        it.setAction("cn.myapp.player.intent.action.PREVIOUS");
        sendBroadcast(it);
    default:
        break;
    }

}

  • 广播的类型:
    • 普通广播:普通广播就是上面代码示例的广播,通过sendBroadcast()发送
    • 有序广播:类似于传话的机制,通过sendOrderedBroadcast()发送广播,在广播传递的过程中,任何一个接收者都可以调用abortBroadcast()方法以终止广播的传递,并且可以通过setDataXXX()系列方法封装数据,后续的广播接收者则可以通过getDataXXX(0方法获取数据。
  • 有序广播的优先级:既然是有序广播,那么就必须保证接收的顺序,引进了优先级的属性来获得决定获得广播的顺序。
    • 有序广播的接收者们可以在匹配的IntentFilter中配置priority属性,表示优先级,取值为int类型的数值,数值越大,则优先级越高,
    • 当priority属性的值相同时,如果注册方式不同,则动态注册的广播接收者优先级更高,静态注册的广播接收者优先级更低(其实是编译的顺序决定了这个优先级)
    • 当priority属性的值相同时,并且注册方式也相同时,按照注册的先后顺序来区分,即根据registerReceiver()方法的调用顺序,或在AndroidManifest.xml文件中节点的顺序来排列,越靠前的优先级越高。如果不同的应用程序都使用静态注册的广播接收者,且优先级相同时,按照应用程序的包名按照字典排序法排序。
    • 这一部分的代码没有办法贴上来,有兴趣的可以去我的github上获取代码,github的地址稍后会贴在个人资料里面。
  • 补充1:以内部类形式存在的广播接收者只能使用动态注册,而一般的广播接收者类可以使用任何一种方式进行注册
  • 补充2:动态注册是临时的,静态注册是常驻的。
  • 补充3:很有意思的一部分内容,开机启动的应用其实也和广播有关系,注册广播后监听开机广播,这样就能实现开机启动。但是现在很多的系统都设置了不允许接收开机广播,比如小米,所以就有了另外一种方式来实现开机启动,那就是丧心病狂的接收所有的广播。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值