BroadcastReceiver广播,是一个全局的监听器,用于应用程序之间的消息传递
之所以是全局,是因为 BroadcastReceiver有自己的进程,只要存在与之匹配的Broadcast被以Intent的形式发送出来,BroadcastReceiver就会被激活
每次发布Broadcast的时候,系统都会创建对应的BroadcastReceiver广播接收者实例,并自动触发onReceive()方法,onReceive()方法执行完成之后,BroadcastReceiver的实例就会被销毁
如果在五秒钟内 onReceive()方法不能 执行完, 系统就会弹出无响应框,所以onReceive()方法里面尽量写耗时短的
广播的角色
模型中有3个角色:广播接收者,广播发布者和消息中心
广播接收者在消息中心注册,广播发布者的广播会发到消息中心,如果在消息中心找到符合发布者要求的接收者的注册信息,就通知接收者,接收者调用onReceive()方法
广播发布者不关心广播能不能被接到,也不关心广播什么时候被接到
广播的分类
- 有序广播: 同步执行 ,发出一个广播之后,由匹配的BroadcastReceiver优先级高的先接收, 可以把结果传入下一个接收器中,也可以终止Broadcast的传播 ,所以可以进行拦截
- 无序广播: 完全异步,发出一个广播之后,理论上,所有的与之匹配的BroadcastReceiver都同时接收到Broadcast,所以不能被拦截
一般系统发送出来的Broadcast均是有序广播,所以可以通过优先级的控制
发送广播的方法
发送方法是对发送者来说的,发送出去的广播只有两种可能,被接收和未被接收
如果有满足接收条件(注册过的)有如下方法
- sendBroadcast():发送普通广播
- sendOrderedBroadcast():发送有序广播
还有一种当发出去的广播,没有接收者注册,是不是就没用了?其实不是,广播是一定有接收者接收的,否则广播就没有意义,没有接收者只是暂时的;我们希望的是,如果遇到这种情况,就把广播存起来,当有接收者来注册时,再发给他,就有了如下方法
- sendStickyBroadcast()
创建广播接收者
创建继承自BroadcastReceiver类定义广播接收者
重写 onReceive 来响应广播
注册 :如果是静态注册在AndroidManifest.xml中注册,如果在动态注册就在代码中
静态注册
1 | <receiver android:name="···"> |
android:name
指定注册的BroadcastReceiver对象android:priority
设置BroadcastReceiver的优先级- 一般还会在
Intent-filter/
指定action
表示这个Intent此次操作的动作category
为Action增加额外的附加信息
动态注册
Content.registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
在代码中进行注册receiver
:注册的BroadcastReceiver对象filter
: Intent 过滤器
Content.unregisterReceiver(BroadcastReceiver receiver)
进行注销receiver
:注册的BroadcastReceiver对象
下面介绍一下以广播作用域分类的广播
本地广播LocalBroadcastManager
本地广播只能够在应用程序内部进行传递,并且广播接收器也只能接收来自本地应用程序发出的广播,相当于把范围限制在了app范围内
LocalBroadcastManager.getInstance(Context context)
context
:上下文
自定义广播权限
只有符合自定义权限要求的广播才接收处理
详见自定义广播