广播接受器( BroadcastReceiver)是 Android 的四大组件之一,Android 中的广播机制是非常灵活的,Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接受自己关心的广播内容,这些广播可能是来自系统的,也可能是来自其他程序的,Android 提供了一套完整的 API,允许应用程序间自由地接受和发送广播,今天我们来一起总结 Broadcast Receiver 的基本用法,我们先来列个大纲,让大家一目了然今天分享的内容
一、广播的机制简介
在 Android 系统中,广播体现在方方面面,是 Android 的四大组件之一,是一个全局的监听器,用于监听和接受应用发出的广播消息,并作出相应的响应,在不同组件之间通信,系统特定情况下的通信,例如当开机完成后系统会产生一条广播,接受到这条广播就能实现开机启动服务的功能、当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示以及保存需要保存的数据等操作、当电池电量发生改变时,系统也会发出一条广播等等这些应用场景都有使用
广播主要的两种类型:标准广播 和 有序广播
标准广播(Normal Broadcasts):是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎同时在统一时刻接受到这条广播消息,因此他们之间没有任何先后顺序而言,这种广播的效率比较高,但同时也意味着它是无法被截断的,标准广播的工作流程如下图:
接下来我们通过代码来验证一下,这里我们新建一个 BroadcastReceiver 项目来演示:
1)首先我们创建 MyReceiver 类并继承 BroadcastReceiver
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
}
我们可以看到 MyReceiver 继承自 BroadcastReceiver,说明这是一个广播,广播里基本什么也没有,只有一个空的构造方法,和一个 onReceive() 方法,这个 onReceiver() 方法就是负责在接收到广播以后根据 Intent 携带来的数据来处理相关的逻辑的,创建完 MyReceiver 之后我们还没有能够使广播进入工作状态,我们还需要注册一个指定的广播地址,注册广播有两种方式:在代码中注册和在 AndroidManifest.xml 中注册,其中前者被称为动态注册,后者被称为静态注册
静态注册:
静态注册就是在 AndroidManifest.xml 中配置的,如下:
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MY_BROADCAST" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
配置了以上信息后,只要是 android.intent.action.MY_BROADCAST 这个地址的广播,MyReceiver 就都能接收得到,还需要注意的就是这种注册的方式是常驻型的,比较浪费内存
动态注册:
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MY_BROADCAST");
registerReceiver(receiver, filter);
动态注册需要在代码中动态的进行相关配置,上面就是我们的注册示范代码,registerReceiver 是 android.content.ContextWrapper 类中的方法,其实 Activity 和 Service 都继承了 ContextWrapper,所以可以直接调用在实际应用中,还有需要注意的就是,在 Activity 和 Service 中注册一个 BroadCastReceiver,当 Activity 和 Service 销毁的时候要记得在 onDestroy() 方法中解除
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
好了 说完了注册的两种常用注册类型,接下来我们继续来验证我们的标准广播的接受情况:
刚才我们已经创建好了自己的 MyReceiver 广播接收器,并且进行了注册,现在我们来发送一条广播,看会发生什么:
public void sendMessage(View view) {
Intent intent = new Intent("android.intent.action.MY_BROADCAST");
intent.putExtra("msg", "hello receiver.");
sendBroadcast(intent);
}
这里我们发送了一条广播,注意 sendBroadcast 也是 ContextWrapper 类中的方法,它可以将一个指定地址和参数信息的 Intent 对象以广播的形式发送出去,这里我们点击发送按钮,,看日志的打印情况:
这里我们看到我们成功的接收到了广播,这里我们只是演示了一个接受者来接受广播,那么如果是多个会怎么样那,接下来我们来新建 3 个广播接受者,看看会是什么情况:
这里我们创建 First、Second、Third 三个接收器来接收广播如下:
public class First extends BroadcastReceiver {
private static final String TAG = "First";
public First() {
}
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Log.i(TAG, "onReceive: " + msg