BroadcastReceiver

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
2
3
4
5
<receiver android:name="···">
<intent-filter android:priority="···">
<action android:name="···"/>
</intent-filter>
</receiver>
  • 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:上下文

自定义广播权限

只有符合自定义权限要求的广播才接收处理

详见自定义广播