上一篇
安卓基础之广播接收器
- 行业动态
- 2025-04-22
- 8
广播接收器是Android组件,用于监听系统或应用广播事件,通过动态/静态注册,在onReceive()中处理逻辑,实现异步响应(如网络变化、电量提醒),无需界面即可完成事件监听与数据
广播接收器的核心概念
定义
广播接收器(BroadcastReceiver)是Android组件之一,用于监听并处理系统或应用内发出的广播事件,广播是一种“发布-订阅”机制,发送方通过Intent
广播事件,接收方通过注册BroadcastReceiver
监听特定事件。
注册方式对比
方式 | 动态注册(代码中) | 静态注册(AndroidManifest.xml) |
---|---|---|
注册时机 | 运行时(如onCreate ) |
应用安装时(Manifest文件) |
生命周期 | 需手动unregister |
随应用启动自动生效 |
适用场景 | 临时事件(如应用内逻辑) | 长期监听(如网络状态、电量变化) |
安全性 | 默认仅当前应用可发送 | 可设置exported 属性控制外部调用 |
核心组件与流程
IntentFilter
- 用于指定
BroadcastReceiver
监听的广播类型(如ACTION_WIFI_CHANGED
)。 - 示例:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
- 用于指定
广播类型
- 系统广播:由系统触发(如来电、网络变化)。
- 应用内广播:应用内部自定义(如模块间通信)。
- 有序广播:按优先级顺序传递,可被截断。
- 无序广播:高效分发,无返回结果。
接收流程
- 发送方通过
sendBroadcast(Intent)
发送广播。 - 系统或应用根据
IntentFilter
匹配接收器。 - 接收器在
onReceive()
中处理逻辑(需快速完成,避免ANR)。
- 发送方通过
生命周期与限制
onReceive()
特性- 在主线程执行,需避免耗时操作(否则触发ANR)。
- 无界面,通常用于触发服务或更新UI组件。
- 执行完后自动销毁,无需手动释放资源。
内存管理
- 静态注册的接收器需谨慎设置
exported
,避免外部应用滥用。 - 动态注册后需在适当时机(如
onDestroy
)调用unregister
,防止内存泄漏。
- 静态注册的接收器需谨慎设置
实际应用案例
监听网络状态变化
// Manifest中静态注册 <receiver android:name=".NetworkChangeReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>
应用内广播示例
// 发送广播 Intent intent = new Intent("com.example.CUSTOM_EVENT"); sendBroadcast(intent); // 动态注册接收器 BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 处理逻辑 } }; registerReceiver(receiver, new IntentFilter("com.example.CUSTOM_EVENT"));
常见问题与解答
问题1:如何区分“有序广播”和“无序广播”?
解答:
- 有序广播:按声明的优先级依次传递,接收器可调用
abortBroadcast()
终止后续传递,适用于需要拦截或处理结果的场景(如优先级高的逻辑)。 - 无序广播:并行分发,效率高,无返回结果,适用于无需拦截的广播(如系统通知)。
示例:// 发送有序广播 sendOrderedBroadcast(intent, null);
问题2:静态注册的广播接收器如何避免内存泄漏?
解答:
- 设置
exported
属性:若无需外部应用发送广播,设置为false
,避免被其他应用调用。 - 动态注册优先:临时事件使用动态注册,并在
onDestroy
中unregister
,减少静态注册的长期占用。 - 弱引用优化:避免在接收器中持有Activity或Service的强引用,防止对象无法回收