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);

posted @ 2025-03-05 09:00  行路客  阅读(3)  评论(0)    收藏  举报  来源