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
相关产品推荐
相关产品推荐

