奇怪的“接收者未注册”例外

在onResume()我做:

registerReceiver(timeTickReceiver, new IntentFilter(Intent.ACTION_TIME_TICK)); 

在onPause()中:

 unregisterReceiver(timeTickReceiver); 

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

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

unregisterReceiver的API文档说:

取消注册以前注册的BroadcastReceiver。

它没有明确说明,但正如您所见,您遇到了IllegalArgumentException: Receiver not registered如果IllegalArgumentException: Receiver not registered ,则未注册。

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

 private Receiver mReceiver = null; 

从我的onServiceConnected:

 sLog.debug("Registering receiver"); mReceiver = new Receiver(); registerReceiver(mReceiver, filter); 

从我的onServiceDisconnected:

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

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

 protected void onPause() { this.unregisterReceiver(reciever); super.onPause(); } 

我猜可能有些状态接收器实际上没有注册,例如用户退出应用程序。

您可能想在运行取消注册之前尝试添加对接收器的检查,(我在几种情况下已完成此操作):

 protected void onPause() { if(timeTickReceiver != null) { unregisterReceiver(timeTickReceiver); } } 

最简单的选择是在代码周围包装try / catch块。

 try{ ... this.unregisterReceiver(reciever); } catch(IllegalArgumentException e) { // TODO: handle exception } catch (Exception e) { // TODO: handle exception } 

应该在onCreate()生命周期方法中注册BroadcastReceiver

 private BroadcastReceiver receiver; @Overrride public void onCreate(Bundle savedInstanceState){ IntentFilter filter = new IntentFilter(); receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { ... } } registerReceiver(receiver, filter); } 

并且应该在onDestory()生命周期方法中取消注册BroadcastReceiver

 @Override protected void onDestroy() { unregisterReceiver(receiver); } 

这将防止取消注册尚未注册的BroadcastReceiver的情况。