动态注册和静态注册的区别
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方法来中断广播的传递