在 Android 中,BroadcastReceiver(广播接收器)用于监听系统或应用发出的广播消息,它有两种注册方式:
- 静态注册(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。
在 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) |
- 优先用动态注册(避免 Android 8.0+ 的静态注册限制)。
- 静态注册仅用于必要的系统广播(如
BOOT_COMPLETED)。 - 动态注册务必配对注销(防止内存泄漏):
@Override protected void onStart() { super.onStart(); registerReceiver(receiver, filter); } @Override protected void onStop() { super.onStop(); unregisterReceiver(receiver); }
- 高版本 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等现代替代方案。