Android BroadcastReceiver注意事项

广播有三种类型:普通广播和有序广播,还有另外一种不怎么常用的粘性广播

普通广播普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,并且无法中断广播的传播。

有序广播发送有序广播后,广播接收者将按预先声明的优先级依次接收Broadcast。优先级高的优先接收到广播,而在其onReceiver()执行过程中,广播不会传播到下一个接收者,此时当前的广播接收者可以终止广播继续向下传播,也可以将intent中的数据进行修改设置,然后将其传播到下一个广播接收者。

粘性广播该广播比较不常用,我们可以通过sendStickyBroadcast()来发送该类型的广播信息,这种的广播的最大特点是,当粘性广播发送后,最后的一个粘性广播会滞留在操作系统中。如果在粘性广播发送后的一段时间里,如果有新的符合广播的动态注册的广播接收者注册,将会收到这个广播消息,虽然这个广播是在广播接收者注册之前发送的,另外一点,对于静态注册的广播接收者来说,这个等同于普通广播。

广播发出的时候,广播接收者接收的顺序如下:

如果广播为有序广播,那么会将动态广播处理器和静态广播处理器合并在一起处理广播的消息,最终确定广播接收的顺序:

1、优先级高的先接收
2、同优先级的动静态广播接收器,动态优先于静态
3、同优先级的动态广播接收器或者同优先级的静态广播接收器;分静态:先扫描的大于后扫描的,动态:先注册的大于后注册的。
 
当广播为普通广播时,有如下的接收顺序:
1、无视优先级,动态广播接收器优先于静态广播接收器
2、同优先级的动态广播接收器或者同优先级的静态广播接收器;分静态:先扫描的大于后扫描的,动态:先注册的大于后注册的。


广播接收机制:当系统或应用发出广播时,将会扫描系统中的所有广播接收者,通过action匹配将广播发送给相应的接收者,接收者收到广播后将会产生一个广播接收者的实例,执行其中的onReceiver()这个方法;特别需要注意的是这个实例的生命周期只有10秒,如果10秒内没执行结束onReceiver(),系统将会报错。另外在onReceiver()执行完毕之后,该实例将会被销毁,所以不要在onReceiver()中执行耗时操作,也不应该在里面创建子线程处理业务(因为可能子线程没处理完,接收者就被回收了);如果执行耗时操作会导致UI不流畅。正确的处理方法就是通过intent调用activity或者service处理业务,可以使用IntentService、创建HandlerThread或者调用Context#registerReceiver(BroadcastReceiver,IntentFilter,String,Handler)方法等方式,在其他Wroker线程执行OnReceiver方法。

推荐:对于只用于应用内的广播,优先使用LocalBroadcastManager 来进行注册和发送,LocalBroadcastManager 安全性更好,同时拥有更高的运行效率。避免广播泄漏以及广播被拦截等安全问题,同时相对全局广播本地广播的更高效。

Intent intent = new Intent();
intent.setAction(MY_BROADCAST_TAG);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

参考链接:https://www.cnblogs.com/weimore/p/7858640.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值