问题描述
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问题