BroadcastReceiver 多次 unregisterReceiver 导致 Receiver not registered问题

341 阅读1分钟

问题描述

NetSetFrag 网络设置页,在界面 onCreateView 时,注册 WiFi 状态变化广播接收器 registerWifiReceiver()onDestroy 时,注销 unregisterWifiReceiver(), 当 Fragment 因为某种原因,例如旋转屏幕时 Activity 重建,重复执行 onDestroy 回调时,App 崩溃抛出异常:

java.lang.IllegalArgumentException: Receiver not registered

解决方案

原因是该广播接收器已被注销,再次注销时无法找到。解决办法是加一个 Tag 标识,防止重复注册、注销。
参考代码如下:

private var mReceiverTag = false // 广播接受者标识

fun registerWifiReceiver() {
    if (!mReceiverTag) {     // 在注册广播接受者的时候 判断是否已被注册,避免重复多次注册广播
        mReceiverTag = true
        // 要监听的状态要在这里注册
        val intentFilter = IntentFilter().apply {
            addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION)
            addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
            addAction(WifiManager.WIFI_STATE_CHANGED_ACTION)
            addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)
        }
        context.registerReceiver(wifiBroadcastReceiver, intentFilter)
    }
}

fun unregisterWifiReceiver() {
    if (mReceiverTag) {   // 判断广播是否注册
        mReceiverTag = false
        context.unregisterReceiver(wifiBroadcastReceiver)
    }
}

参考资料:

BroadcastReceiver多次unregisterReceiver 导致 Receiver not registered问题