3-5安卓中的Broadcast Receiver组件
一、广播的分类
标准广播(Normal Broadcast)
通过sendBroadcast()发送,所有匹配的接收器同时异步接收,无法中断或修改广播内容。适用于无需顺序处理的事件(如全局状态通知)。
有序广播(Ordered Broadcast)
使用sendOrderedBroadcast()发送,接收器按优先级顺序处理(优先级通过android:priority属性设置),高优先级接收器可中断广播或修改数据。典型场景如短信拦截。
本地广播(Local Broadcast)
通过LocalBroadcastManager发送,仅在应用内部传播,避免全局广播的安全与性能问题,适合组件间通信。
二、注册方式
静态注册
在AndroidManifest.xml中声明,接收器常驻系统,应用未启动时也能响应(如监听开机事件)。需注意:
Android 8.0(API 26)后限制隐式广播,需显式指定包名或类名。
示例代码:
xml
动态注册
在代码中通过registerReceiver()注册,生命周期与组件(如Activity)绑定,需在onDestroy()中调用unregisterReceiver()避免内存泄漏。适用于临时监听(如屏幕状态变化)。
三、核心方法与生命周期
**onReceive(Context, Intent)**
接收广播时系统自动调用,需注意:
执行在主线程,耗时操作需转交IntentService或异步线程,否则可能触发ANR(超时10秒)。
实例短暂存活:方法执行完毕后实例销毁,不可保存状态。
有序广播处理
通过setResultExtras(Bundle)传递数据,abortBroadcast()终止传播。
四、实际应用场景
系统事件监听
网络状态变化(CONNECTIVITY_CHANGE)。
电量低警告(ACTION_BATTERY_LOW)。
时区变更(ACTION_TIMEZONE_CHANGED)。
自定义广播通信
应用内组件通信(如通知Fragment更新UI)。
跨应用协作(需权限控制,如android:permission)。
粘性广播(已弃用)
Android 5.0后不再推荐使用,因其可能导致内存泄漏。
五、安全与性能优化
权限控制
发送方:通过sendBroadcast(Intent, String permission)限制接收者权限。
接收方:在注册时声明android:permission,仅允许授权应用接收。
本地广播优化
使用LocalBroadcastManager减少系统开销,避免隐私泄露。
动态注册的及时注销
避免因未注销导致的内存泄漏,尤其注意在onPause()而非onStop()中注销。
六、代码示例
java
// 发送自定义广播
Intent intent = new Intent(“com.example.MY_ACTION”);
intent.putExtra(“data”, “Hello”);
sendBroadcast(intent);
// 动态注册接收器
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra(“data”);
Toast.makeText(context, data, Toast.LENGTH_SHORT).show();
}
};
IntentFilter filter = new IntentFilter(“com.example.MY_ACTION”);
registerReceiver(receiver, filter);