奇怪的"接收者未注册"例外

fhu*_*cho 24 android broadcastreceiver

在onResume()我做:

registerReceiver(timeTickReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
Run Code Online (Sandbox Code Playgroud)

并在onPause()中:

unregisterReceiver(timeTickReceiver);
Run Code Online (Sandbox Code Playgroud)

我在Android Developer Console中看到"java.lang.IllegalArgumentException:Receiver not registered"报告(只有2个报告,我的应用程序有数千个用户).异常由unregisterReceiver()触发.可能发生什么?用try-catch围绕它我感觉不自信.

Dan*_*n J 21

我们在特定屏幕上长按,然后立即进行两次方向更改(例如,将设备颠倒)时看到此错误.

unregisterReceiver的API文档说:

取消注册以前注册的BroadcastReceiver.

它没有明确说明,但正如你所见,IllegalArgumentException: Receiver not registered如果它尚未注册,你就会命中.

我正在使用的解决方法是将我的Receiver存储为成员字段,并在未注册时将其设置为null,即将其初始化为null,然后仅在我注册时设置它.这可能不完美,但它确实解决了我的崩溃!

private Receiver mReceiver = null;
Run Code Online (Sandbox Code Playgroud)

从我的onServiceConnected:

sLog.debug("Registering receiver");
mReceiver = new Receiver();
registerReceiver(mReceiver, filter);
Run Code Online (Sandbox Code Playgroud)

从我的onServiceDisconnected:

if (mReceiver == null)
{
  sLog.info("Do not unregister receiver as it was never registered");
}
else
{
  sLog.debug("Unregister receiver");
  unregisterReceiver(mReceiver);
  mReceiver = null;
}
Run Code Online (Sandbox Code Playgroud)


小智 6

广播接收器应该在onPause()生命周期方法中取消注册

protected void onPause() {
    this.unregisterReceiver(reciever);
    super.onPause();
}
Run Code Online (Sandbox Code Playgroud)