BroadcastReceiver广播接收器
用于监听/接受Android应用分发的各类广播并做出相应的响应
应用场景:
- 监听系统事件:如开机广播,网络链接与断开,屏幕转向灯
- 不同组件间(Activity/Service,包括不同APP间)的通信
- 多线程通信
先自定义一个广播接收器,创建MyBroadcastReceiver类来继承广播接收器类,并实现它内部的方法
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
广播接收器的注册方法分为静态注册和动态注册两种方式
静态注册
在AndroidManifest.xml文件的<application>
标签内声明
<!--静态注册广播接收器-->
<receiver
android:name=".MyBroadcastReceiver">
<!--接受哪些广播-->
<intent-filter>
<!--开机广播-->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<!--电量低广播-->
<action android:name="android.intent.action.BATTERY_LOW"/>
</intent-filter>
</receiver>
完成注册后就可以在MyBroadcastReceiver类中接受广播实现相关功能
public class MyBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "MyBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
// 接受广播
if (intent != null) {
// 接收到的什么广播(广播的名称)
String action = intent.getAction();
Log.d(TAG, "onReceive: " + action);
}
}
}
这里已经可以通过意图对象来接受广播信息并进行处理了
动态注册
动态注册在onCreate()
方法里进行注册
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 新建一个广播接收器
broadcastReceiver = new MyBroadcastReceiver();
// 要接收哪些广播
IntentFilter intentFilter = new IntentFilter();
/// 电量低广播
intentFilter.addAction(Intent.ACTION_BATTERY_LOW);
// 注册广播接收器
registerReceiver(broadcastReceiver, intentFilter);
}
动态注册的广播接收器必须要在onDestroy()
方法里面取消注册
注册和取消注册要一一对应,不然会报错,内存会泄漏
@Override
protected void onDestroy() {
super.onDestroy();
// 取消注册广播接收器
if (broadcastReceiver != null) {
unregisterReceiver(broadcastReceiver);
}
}
动态注册不需要在AndroidManifest.xml文件里声明,直接通过代码进行注册。对于接收广播进行处理也是在创建的MyBroadcastReceiver类里面,这点跟静态注册一样
广播生命周期
BroadcastReceiver的生命周期很短暂,该类的onReceive()
方法是运行在主线程中,如果在该方法里的操作超过了10s,会阻塞主线程,出现ANR程序无响应情况
如果需要进行耗时操作,可以通过Intent传递给Service进行处理,尽量不要在该方法中开启线程进行处理,否则10s后,该线程有可能会变陈空线程,导致任务丢失