当前位置:首页 > 行业动态 > 正文

安卓基础之广播接收器

广播接收器是Android组件,用于监听系统或应用广播事件,通过动态/静态注册,在onReceive()中处理逻辑,实现异步响应(如网络变化、电量提醒),无需界面即可完成事件监听与数据

广播接收器的核心概念

定义
广播接收器(BroadcastReceiver)是Android组件之一,用于监听并处理系统或应用内发出的广播事件,广播是一种“发布-订阅”机制,发送方通过Intent广播事件,接收方通过注册BroadcastReceiver监听特定事件。


注册方式对比

方式 动态注册(代码中) 静态注册(AndroidManifest.xml)
注册时机 运行时(如onCreate 应用安装时(Manifest文件)
生命周期 需手动unregister 随应用启动自动生效
适用场景 临时事件(如应用内逻辑) 长期监听(如网络状态、电量变化)
安全性 默认仅当前应用可发送 可设置exported属性控制外部调用

核心组件与流程

  1. IntentFilter

    • 用于指定BroadcastReceiver监听的广播类型(如ACTION_WIFI_CHANGED)。
    • 示例:
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  2. 广播类型

    • 系统广播:由系统触发(如来电、网络变化)。
    • 应用内广播:应用内部自定义(如模块间通信)。
    • 有序广播:按优先级顺序传递,可被截断。
    • 无序广播:高效分发,无返回结果。
  3. 接收流程

    安卓基础之广播接收器

    • 发送方通过sendBroadcast(Intent)发送广播。
    • 系统或应用根据IntentFilter匹配接收器。
    • 接收器在onReceive()中处理逻辑(需快速完成,避免ANR)。

生命周期与限制

  • onReceive()特性

    • 在主线程执行,需避免耗时操作(否则触发ANR)。
    • 无界面,通常用于触发服务或更新UI组件。
    • 执行完后自动销毁,无需手动释放资源。
  • 内存管理

    • 静态注册的接收器需谨慎设置exported,避免外部应用滥用。
    • 动态注册后需在适当时机(如onDestroy)调用unregister,防止内存泄漏。

实际应用案例

  1. 监听网络状态变化

    安卓基础之广播接收器

    // Manifest中静态注册
    <receiver android:name=".NetworkChangeReceiver">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>
  2. 应用内广播示例

    // 发送广播
    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,避免被其他应用调用。
  • 动态注册优先:临时事件使用动态注册,并在onDestroyunregister,减少静态注册的长期占用。
  • 弱引用优化:避免在接收器中持有Activity或Service的强引用,防止对象无法回收