代码注册BroadcastReceiver出现IntentReceiverLeaked错误求助
解决IntentReceiverLeaked错误:在Service中正确管理BroadcastReceiver
嘿,我知道你遇到的这个IntentReceiverLeaked问题是怎么回事了——这通常是因为你在Service里注册了BroadcastReceiver,但没在Service销毁的时候及时注销它,导致接收器还绑定在已经被销毁的Service实例上,引发了内存泄漏。
给你几个具体的解决步骤,结合你的代码来调整:
1. 务必在Service销毁时注销接收器
你需要在Service的onDestroy()方法里调用unregisterReceiver(),把之前注册的接收器释放掉,这是解决泄漏的核心。修改后的代码大概是这样:
public class MyAlarmServiceClass extends Service { private StopListener listener; // 把listener设为类的成员变量,方便后续注销 @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { listener = new StopListener(); // 补全完整的Action:断开充电器的广播Action是Intent.ACTION_POWER_DISCONNECTED registerReceiver(listener, new IntentFilter(Intent.ACTION_POWER_DISCONNECTED)); // 根据你的业务需求选择合适的返回值,比如START_STICKY return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); // 注销前先判空,避免空指针异常 if (listener != null) { unregisterReceiver(listener); listener = null; // 置空帮助GC回收资源 } } // 你的BroadcastReceiver实现类 private class StopListener extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 判断是否是充电器断开的广播 if (Intent.ACTION_POWER_DISCONNECTED.equals(intent.getAction())) { // 停止当前服务 stopSelf(); } } } }
2. 额外的注意点
- 检查你的IntentFilter:你代码里的
Intent.ACT...应该是没写完,断开充电器对应的正确Action是Intent.ACTION_POWER_DISCONNECTED,要补全哦。 - 避免重复注册:如果你的Service可能被多次启动,建议在注册接收器前先判断
listener是否为空,防止重复注册导致后续注销时报错。 - 动态注册的接收器必须成对操作:注册和注销一定要对应,这是避免这类泄漏问题的基本原则。
简单来说,就是保证Service活着的时候接收器注册有效,Service销毁的时候接收器也跟着注销,这样就不会出现IntentReceiverLeaked的错误啦。
内容的提问来源于stack exchange,提问作者Lokik Soni
相关产品推荐
相关产品推荐

