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