如何正确注销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
相关产品推荐
相关产品推荐

