奇怪的“收件人未注册”例外

在onResume()我做:

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

和onPause():

 unregisterReceiver(timeTickReceiver); 

我在Android开发者控制台中看到“java.lang.IllegalArgumentException:Receiver not registered”报告(只有两个报告,我的应用有成千上万的用户)。 exception由unregisterReceiver()触发。 会发生什么? 我不觉得有什么信心只是试试看。

Solutions Collecting From Web of "奇怪的“收件人未注册”例外"

在特定屏幕上长按,我们已经看到了这个错误,然后立即做了两个方向改变(例如颠倒设备)。

unregisterReceiver的API文档说:

取消注册以前注册的BroadcastReceiver。

它没有明确地说,但正如你所看到的,你打了IllegalArgumentException: Receiver not registered如果它尚未注册IllegalArgumentException: Receiver not registered注册。

我使用的解决方法是将我的Receiver作为成员字段存储,并将其设置为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); } } 

最简单的select是围绕代码包装try / catch块。

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

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

 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的情况。