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

Android前台服务广播接收器注销报错:Receiver not registered

解决广播接收器注销时的IllegalArgumentException错误

错误原因

你在onStartCommand方法中创建了一个全新的WifiStateChangeReceiver实例并完成注册,但在onDestroy方法里又创建了另一个完全独立的WifiStateChangeReceiver实例去执行注销操作。由于系统通过对象实例追踪已注册的广播接收器,这两个不同实例无法匹配,导致系统判定你要注销的接收器从未被注册,从而抛出IllegalArgumentException。

修复后的代码

package bd.maruf.ruwifimanager

import android.app.Service
import android.content.Intent
import android.content.IntentFilter
import android.os.IBinder

class Test: Service() {
    // 声明为成员变量,确保注册和注销的是同一个实例
    private var wifiReceiver: WifiStateChangeReceiver? = null

    override fun onBind(intent: Intent?): IBinder? {
        TODO("Not yet implemented")
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // 避免重复注册(如果Service被多次启动)
        if (wifiReceiver == null) {
            wifiReceiver = WifiStateChangeReceiver()
            registerReceiver(
                wifiReceiver,
                IntentFilter("android.net.wifi.supplicant.STATE_CHANGE")
            )
        }
        return START_NOT_STICKY
    }

    override fun onDestroy() {
        // 注销前先判断接收器是否存在,避免空指针
        wifiReceiver?.let {
            unregisterReceiver(it)
            wifiReceiver = null // 清空引用,帮助GC回收
        }
        super.onDestroy()
    }
}

关键修复点

  • 将WifiStateChangeReceiver声明为Service的成员变量,保证注册和注销操作针对同一个对象实例
  • 添加空值判断,避免Service多次启动时重复注册接收器,同时防止注销时出现空指针异常
  • 注销完成后清空接收器引用,帮助垃圾回收器回收资源

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:12:26