Android java.lang.IllegalArgumentException:服务未注册

我有一个看起来像这样的设置:

class MyFragment implements SomeEventListener { Application mAppContext; boolean mBound; boolean mDidCallUnbind; MyIBinder mBinder; ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mBound = true; mBinder = (MyIBinder) service; mBinder.getThings();... } @Override public void onServiceDisconnected(ComponentName name) { mDidCallUnbind = false; mBound = false; mBinder = null; } }; ... @Override public void onSomeEvent() { mAppContext.bindService(...); } void unbindService() { if (mBound && !mDidCallUnbind) { mDidCallUnbind = true; mAppContext.unbindService(mConnection); } } @Override public void onPause() { unbindService(); super.onPause(); } } 

但是,我仍然不时地看到标题中的错误: java.lang.IllegalArgumentException: Service not registered调用unbindService()java.lang.IllegalArgumentException: Service not registered生成java.lang.IllegalArgumentException: Service not registered 。 我错过了一些愚蠢的事情,还是还有更多的事情发生? 我应该注意到,这个片段可能不止一个存在。

编辑

由于似乎没有人真正阅读代码,让我解释一下。 除非绑定服务( mBound否则unbindService()不调用Context.unbindService(ServiceConnection)并且之前未调用onServiceDisconnected(...)回调,之前可能调用unbindService()

请注意,在任何情况下,Android都会为您取消绑定服务,以使服务不受约束,但不会调用onServiceDisconnected,从而使我处于陈旧状态?

另外,我正在使用我的Application上下文来进行初始绑定。 假设像:

 @Override public void onCreate() { mApplication = getContext().getApplicationContext(); } 

我意识到这个问题已经得到了回答。 但我认为有理由去研究人们犯这个错误的原因。

问题实际上是培训文档。 http://developer.android.com/reference/android/app/Service.html显示正确的实施,而“ActivityMessenger”中的https://developer.android.com/guide/components/bound-services.html显示了非常不正当的实施。

在“ActivityMessenger”示例中,可能会在服务实际绑定之前调用onStop()。

这种混淆的原因是它们使用绑定服务布尔值来表示不同示例中的不同内容。 (主要是被称为OR的bindService()是实际连接的服务)

在正确的示例中,unbind()基于绑定的布尔值完成,绑定的布尔值表示调用bindService() 。 由于它排队等待主线程执行,因此无论何时(如果有)onServiceConnected()发生,都需要调用unbindService()(因此排队等待执行)。

在其他示例中,例如http://developer.android.com/reference/android/app/Service.html中的示例。 绑定表示服务实际上已绑定,因此您可以使用它而不会获得NullPointerException。 请注意,在此示例中,仍然进行unbindService()调用,并且绑定的布尔值不确定是否取消绑定

doBindService()doUnbindService()使用mIsBound而不是在ServiceConnection实例中。

 ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mBinder = (MyIBinder) service; } @Override public void onServiceDisconnected(ComponentName name) { mBinder = null; } }; ... public void doBindService() { bindService(new Intent(this, MyService.class), mConnection, Context.BIND_AUTO_CREATE); mIsBound = true; } public void doUnbindService() { if (mIsBound) { unbindService(mConnection); mIsBound = false; } } 

这是在http://developer.android.com/reference/android/app/Service.html中完成的

java.lang.IllegalArgumentException: Service not registered意味着在调用unbindService()时未绑定服务。

所以在你的情况下,在onPause()调用unbindService()之前从未调用unbindService() onPause()

我的申请问题完全相同。 我IllegalArgumentException会得到IllegalArgumentException 。 我猜这种特殊情况是在服务未绑定并且 onServiceDisconnected 之前 onServiceDisconnected onPause onServiceDisconnected 。 所以我会尝试Synchronized东西,以确保正确执行。

此exception的另一个可能原因可能是错误的Context调用unbindService 。 因为服务不仅可以通过Activities绑定,还可以通过Contextinheritance的其他实例(BroadcastReceivers除外)绑定,即使是其他服务也是如此,请确保绑定Service的上下文调用unbindService ,而不是绑定Service本身。 这将直接产生上述“服务未注册”的exception。