AS入门(九) 组件篇之Broadcast Receiver
Android四大组件:BroadcastReceiver史上最全面解析
作用:
监听应用发出的广播,做出响应,不同App之间,系统应用的通信
广播的种类:
-
普通广播:普通广播发出后,会同时发送给所有的广播接收器,不可以被拦截
普通广播 -
有序广播:有序广播发送后,在同一时刻只会被一个接收器接收,会根据接收器的优先级决定谁先接收,可以被拦截,拦截后后续的接收器将无法收到
有序广播
特殊广播:
- 本地广播:只能被当前app接收,解决全局广播的安全性问题
- 粘性广播
sticky
:广播会滞留直到可以接收的接收器被注册(类似EventBus的粘性事件)已废弃
- 系统广播:Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播
实现原理:
基于观察者模式:被观察者(广播发送方) 通知观察者(广播接收方)做出响应;
- 广播接收者通过Binder在AMS中注册
- 广播发送方通过Binder将广播发送给AMS
- AMS根据广播的
intentFilter
选择合适的广播接收者,回调onReceive()
广播接收器注册:
- 静态注册:在AndroidManifest.xml里通过标签声明
特点:不受生命周期影响,程序关闭后任然有效,耗内存,耗电
- 动态注册:在代码中通过
Context.registerReceiver()
注册
特点:跟随组件的生命周期变化
广播的发送:
1.普通广播
Intent intent = new Intent();
//对应BroadcastReceiver中intentFilter的action
intent.setAction(BROADCAST_ACTION);
//发送广播
sendBroadcast(intent);
2. 有序广播
sendOrderedBroadcast(intent);
3. 本地广播
- 将exported属性设置为false
- 通过intent.setPackage(packageName)指定报名
- 使用LocalBroadcastManager发送(本地广播接收器只能通过LocalBroadcastManager动态注册)
//注册应用内广播接收器
//步骤1:实例化BroadcastReceiver子类 & IntentFilter mBroadcastReceiver
mBroadcastReceiver = new mBroadcastReceiver();
//步骤2:实例化LocalBroadcastManager的实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);
//步骤3:设置接收广播的类型
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
//步骤4:调用LocalBroadcastManager单一实例的registerReceiver()方法进行动态注册
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);
//发送应用内广播
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
localBroadcastManager.sendBroadcast(intent);
//取消注册应用内广播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
注意点:
- 动态注册的广播需要手动注销
- 不允许重复注册,重复注销
- onResume()注册,onPause()注销,因为activity在销毁前一定会执行Pause;
- 接收器的onReceive()是UI线程,不可以进行耗时操作
- 不同注册方式的广播接收器回调OnReceive(Context context,Intent intent)中的context返回值是不一样的;
网友评论