BroadcastReceiver
定义
中文意思“广播接收者”,是一个全局的监听器,属于Android四大组件之一。
使用场景
- 同一个App内部的同一组件内的消息通信(单个或者多个线程之间);
- 同一个App内部的不同组件之间的消息通信(单个进程);
- 同一个App具有多个进程的不同组件之间的消息通信;
- 不同App之间的组件之间消息通信;
- Android系统在特定的情况下与App之间的消息通信。
BroadcastReceiver的注册
注册方式分为两种:静态注册、动态注册。
1.静态注册
注册方式:在AndroidManifest.xml里通过<receive>
标签声明;
属性说明:
<receiver
android:enabled=["true" | "false"]
// 此broadcastReceiver能否接收其他App的发出的广播
// 默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
// 继承BroadcastReceiver子类的类名
android:name=".mBroadcastReceiver"
// 具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收;
android:permission="string"
// BroadcastReceiver运行所处的进程
// 默认为app的进程,可以指定独立的进程
// 注:Android四大基本组件都可以通过此属性指定自己的独立进程
android:process="string" >
// 用于指定此广播接收器将接收的广播类型
// 本这里给出的是用于接收网络状态改变时发出的广播
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
注册示例:
<receiver
//此广播接收者类是MyBroadcastReceiver
android:name=".MyBroadcastReceiver" >
//用于接收网络状态改变时发出的广播
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
当App首次启动时,系统会自动实例化MyBroadcastReceiver类,并注册到系统中。
2.动态注册
注册方式:在代码中调用Context.registerReceiver()
方法。
示例代码:
// 选择在Activity生命周期方法中的onResume()中注册
@Override
protected void onResume(){
super.onResume();
// 1. 实例化BroadcastReceiver子类 & IntentFilter
mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
// 2. 设置接收广播的类型
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
// 3. 动态注册:调用Context的registerReceiver()方法
registerReceiver(mBroadcastReceiver, intentFilter);
}
// 注册广播后,要在相应位置记得销毁广播,否则程序会出现报错
// 即在onPause() 中unregisterReceiver(mBroadcastReceiver)
// 当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中
// 当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。
@Override
protected void onPause() {
super.onPause();
//销毁在onResume()方法中的广播
unregisterReceiver(mBroadcastReceiver);
}
}
总结
- 动态注册广播不是常驻型广播,也就是说广播跟随Activity的生命周期。注意在Activity结束前,移除广播接收器。静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行;
- 当广播为有序广播时:优先级高的先接收(不分静态和动态)。同优先级的广播接收器,动态优先于静态;
- 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的;
- 当广播为默认广播时:无视优先级,动态广播接收器优先于静态广播接收器。同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后册的。