You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确注销Broadcast Receiver?已成功注册,想在onDestroy中注销

嘿,很高兴你已经成功注册了Broadcast Receiver!关于在onDestroy()方法里正确注销它的问题,得分两种情况来唠——毕竟广播的注册方式不同,注销逻辑也完全不一样:

1. 动态注册的广播接收器(必须手动注销!)

如果你的广播接收器是通过代码里的registerReceiver()方法注册的(也就是动态注册),那一定要在组件销毁时手动注销,不然会造成内存泄漏,严重的还会引发系统异常。

具体步骤示例:

首先,在你的Activity/Fragment里声明一个接收器的成员变量,确保它能被注册和注销方法都访问到:

// 声明成员变量,保存接收器实例
private MyBroadcastReceiver mMyReceiver;

然后在合适的时机(比如onCreate())完成注册:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 初始化接收器实例
    mMyReceiver = new MyBroadcastReceiver();
    // 创建IntentFilter,指定要监听的广播Action
    IntentFilter filter = new IntentFilter("com.example.MY_CUSTOM_BROADCAST_ACTION");
    // 注册广播接收器
    registerReceiver(mMyReceiver, filter);
}

最后在onDestroy()里完成注销,记得要做非空判断,避免空指针异常:

@Override
protected void onDestroy() {
    super.onDestroy();
    // 注销广播接收器,必须和注册的是同一个实例!
    if (mMyReceiver != null) {
        unregisterReceiver(mMyReceiver);
        // 置空帮助GC回收,避免内存泄漏
        mMyReceiver = null;
    }
}

敲黑板的注意事项:

  • 注销的必须是和注册时完全相同的实例,如果你在注销时new一个新的接收器对象,会直接抛出IllegalArgumentException异常
  • 一定要加非空判断,防止注册逻辑没执行过(比如Activity还没走到onCreate()就被销毁)导致空指针
  • 如果是在Fragment中使用,推荐在onDestroyView()或者onDestroy()里注销,同样要保证注册和注销的实例一致
2. 静态注册的广播接收器(无需手动注销)

要是你的广播接收器是在AndroidManifest.xml里通过<receiver>标签注册的(静态注册),那完全不用在onDestroy()里做任何操作!

这种注册方式是由系统统一管理生命周期的,不管你的组件是否销毁,只要App还在设备上,系统就能根据配置的广播Action触发它。强行调用unregisterReceiver()反而会报错,因为静态注册的接收器没有和当前组件绑定具体的实例。

最后总结一下:

只有动态注册的广播接收器需要在onDestroy()里调用unregisterReceiver(),核心是保证注册和注销的是同一个实例;静态注册的广播接收器交给系统打理就好,不用手动干预~

内容的提问来源于stack exchange,提问作者rmdan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:29:49