Skip to content

Latest commit

 

History

History
153 lines (129 loc) · 5.22 KB

File metadata and controls

153 lines (129 loc) · 5.22 KB

在 Android 中,BroadcastReceiver(广播接收器)用于监听系统或应用发出的广播消息,它有两种注册方式:

  1. 静态注册(Manifest 声明)
  2. 动态注册(代码注册)

它们的核心区别在于 注册方式、生命周期、适用场景。下面详细对比分析:


📌 1. 静态注册(Manifest 声明)

注册方式

在 AndroidManifest.xml 中声明 <receiver>:

<receiver android:name=".MyReceiver" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

特点:

  • 全局生效,即使应用未运行也能接收广播(如开机启动 BOOT_COMPLETED)。
  • 系统自动管理,无需手动注册/注销。

适用场景

✅ 监听系统广播(如开机、网络变化、电池状态)。
✅ 跨进程通信(exported="true" 允许其他 App 发送广播)。

限制

❌ Android 8.0+ 限制:

  • 大部分 隐式广播(非特定 App 的广播)无法静态注册(如 CONNECTIVITY_CHANGE)。
  • 需改用 动态注册 或 JobScheduler。

📌 2. 动态注册(代码注册)

注册方式

在 Activity/Service 等组件中调用 registerReceiver():

// 1. 定义 BroadcastReceiver
BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("Receiver", "收到广播: " + intent.getAction());
    }
};

// 2. 动态注册(通常在 onStart()/onResume())
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.MY_CUSTOM_ACTION");
registerReceiver(receiver, filter);

// 3. 必须手动注销(通常在 onStop()/onDestroy())
unregisterReceiver(receiver);

特点:

  • 灵活控制,只在组件活跃时接收广播。
  • 手动管理生命周期,避免内存泄漏。

适用场景

✅ 应用内通信(如通知某个界面更新)。
✅ 监听频繁变化的广播(如屏幕亮灭、耳机插拔)。

限制

❌ 依赖组件生命周期,组件销毁后无法接收广播(需重新注册)。


📊 两种方式对比

特性 静态注册 动态注册
注册方式 AndroidManifest.xml registerReceiver()
生效范围 全局(即使应用未运行) 仅当注册的组件活跃时生效
生命周期 由系统管理,长期有效 需手动注册/注销,随组件销毁失效
Android 8.0+ 限制 大部分隐式广播不可用 不受限制
跨进程通信 支持(exported="true") 仅限当前应用
典型用途 监听系统事件(如开机、充电) 应用内实时通信(如更新 UI)

⚡ 最佳实践

  1. 优先用动态注册(避免 Android 8.0+ 的静态注册限制)。
  2. 静态注册仅用于必要的系统广播(如 BOOT_COMPLETED)。
  3. 动态注册务必配对注销(防止内存泄漏):
    @Override
    protected void onStart() {
        super.onStart();
        registerReceiver(receiver, filter);
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(receiver);
    }
  4. 高版本 Android 推荐替代方案:
    • 用 WorkManager 替代后台广播。
    • 用 LocalBroadcastManager(已废弃)或 LiveData 替代应用内通信。

💡 示例场景

静态注册(监听开机启动)

<!-- AndroidManifest.xml -->
<receiver android:name=".BootReceiver" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Log.d("BootReceiver", "系统启动完成!");
        }
    }
}

动态注册(监听网络变化)

// 在 Activity 中注册
@Override
protected void onStart() {
    super.onStart();
    IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver(networkReceiver, filter);
}

private BroadcastReceiver networkReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("NetworkReceiver", "网络状态变化");
    }
};

@Override
protected void onStop() {
    super.onStop();
    unregisterReceiver(networkReceiver);
}

总结

  • 静态注册:长期监听系统事件,但受 Android 8.0+ 限制。
  • 动态注册:灵活可控,适合应用内实时通信,需手动管理生命周期。
  • Android 高版本推荐:尽量使用 WorkManager、LiveData 等现代替代方案。