Broadcast的一些注意事项

动态注册和静态注册的区别
1.动态注册的广播永远要快于静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低

2.动态注册广播不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器

静态注册是常驻型 ,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行

3.在同一个优先级下,谁先启动的快,谁将先接收到广播


注册广播的两种方式:动态注册,静态注册

动态注册

registerReceiver(receiver, filter)

这个方法是Context的abstract方法,由子类ContextWrapper的实现类实现并调用,比如Activity

//Context类源码
@Nullable
public abstract Intent registerReceiver(@Nullable BroadcastReceiver receiver,
                                        IntentFilter filter);
//ContextWrapper类源码
@Override
public Intent registerReceiver(
    BroadcastReceiver receiver, IntentFilter filter) {
    return mBase.registerReceiver(receiver, filter);
}

动态注册广播不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器!!!

参数:

receiver – 用于处理广reveiver播的 BroadcastReceiver。
filter – 选择要接收的意图广播。
return:
找到的第一个粘性intent匹配过滤器,如果没有,则为 null。(暂时不知道这个粘性怎么解释)


静态注册

手动创建一个继承自BroadcastReceiver的类,重写onReceive方法,在AndroidManifest中进行注册,如果注册的广播是带有权限的,则广播方必须通过其清单中的< user-permission >标记请求该权限,才能向该接收器发送 Intent。

注意点:Android8.0之后,静态注册的BroadcastReceiver无法接受隐式广播,默认情况下发出的自定义广播都是隐式广播,可以通过调用Intent的setPackage方法来指定这条广播是发送给哪个应用程序的,让他变成一条显式广播(隐式广播:没有具体指定发送给哪个应用的广播


静态注册的广播接收者无法接受隐式广播

为了解决这个问题,有两个方法:

1 在Activity或其他组件中动态注册广播(既要注册又要取消注册,而且静态注册的广播接收者仍处于不可用的状态,不推荐使用)

2 发送显示广播(推荐使用,指定BroadcastReceiver或者指定广播发送给哪个应用,如上)

隐式广播例外情况


BroadcastReceiver可以通过intent-filter中的priority属性设置优先级,属性值越大,优先级越高

如果广播是有序广播,那么可以通过设置优先级来进行广播的接收,还可以通过abortBroadcast方法来中断广播的传递

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值