Android基础知识(十四):Broadcast Receiver简介与基本用法
一、广播机制简介
为了便于进行系统级别的消息通知,Android引入了一套类似的广播消息机制。Android中的每个应用程序都可以对自己感兴趣的广播进行注册,从而接收到所关心的广播内容,这些广播可能来自系统,也可能来自其他应用程序。
广播的发送是通过Intent发送的,而广播的接收通过Broadcast Receiver(广播接收器)实现。
Android中的广播主要分为两类:标准广播和有序广播。
- 标准广播(Normal broadcasts)
标准广播是一种完全异步执行的广播,在广播发出之后,所有广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。标准广播的工作流如图所示。
- 有序广播(Ordered broadcasts)
有序广播是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到这条消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递
广播接收器是有先后顺序的,优先级高的广播接收器先收到广播消息,并且前面的广播接收器可以截断正在传递的广播。有序广播的工作流程如图所示。
二、Broadcast Receiver注册方式及基本用法
广播接收器的注册方式有两种:动态注册和AndroidManifest.xml文件中进行静态注册(Android8.0之前)。
动态注册广播接收器的特点是当用来注册的Activity关掉后,广播也就失效。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开的状态,也就是说只要移动端处于开机状态,无论app是否开启该app订阅的广播在触发时也会对其起作用。
- 动态注册广播接收器
如下代码所示为动态注册广播接收器,其中广播接收器为NetWorkChangeReceiver,通过IntentFilter对接收的广播进行筛选,筛选要接收的广播,并使用registerReceiver()方法进行动态注册。需要注意的是,动态注册的广播接收器需要取消注册,因此此处在onDestroy()方法中调用unregisterReceiver()方法实现。
private IntentFilter mIntentFilter;
private NetWorkChangeReceiver mNetWorkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_receiver_test);
mIntentFilter = new IntentFilter();
mIntentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
mNetWorkChangeReceiver = new NetWorkChangeReceiver();
//动态注册广播接收器
registerReceiver(mNetWorkChangeReceiver,mIntentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//注销广播接收器
unregisterReceiver(mNetWorkChangeReceiver);
}
/**
* 广播接收器
*/
class NetWorkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
}
}
- 静态注册广播接收器
静态注册广播接收器是在AndroidManifest.xml文件中注册,如下所示,其中enabled表示是否启用广播接收器,exported表示是否允许这个广播接收器接收本程序以外的广播。而action则表示接受一条值为“android.inten…"的广播,即表明了该广播接收器可接受的广播。
<receiver android:name=".StaticBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.STATICBROADCASTRECEIVER"></action>
</intent-filter>
</receiver>
参考资料:《第一行代码 Android 第2版》