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() . Мне что-то не хватает, или еще больше происходит? Я должен отметить, что может существовать более одного из этого самого фрагмента.

редактировать

Поскольку никто, по-видимому, не читает код, позвольте мне объяснить. unbindService() не вызывает Context.unbindService (ServiceConnection), если служба не привязана ( mBound ), и она ранее не onServiceDisconnected(...) до того, onServiceDisconnected(...) обратный вызов onServiceDisconnected(...) был onServiceDisconnected(...) из предыдущего предыдущего вызова unbindService() .

Имейте в виду, есть ли случаи, когда Android отменит ваш сервис для вас, так что служба станет несвязанной, но onServiceDisconnected не будет вызвана, оставив меня в устаревшем состоянии?

Кроме того, я использую свой контекст приложения для первоначальной привязки. Предположим что-то вроде:

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

Solutions Collecting From Web of "Android java.lang.IllegalArgumentException: служба не зарегистрирована"

Используйте mIsBound внутри doBindService() и doUnbindService() вместо экземпляра 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() .

Поэтому в вашем случае onSomeEvent() никогда не вызывался перед вызовом unbindService() в onPause()

У меня такая же проблема с моим приложением. Время от времени я получаю IllegalArgumentException . Я предполагаю, что особый случай вызван, когда служба несвязана, и onPause вызывается перед onServiceDisconnected . Поэтому я бы попытался Synchronized вещи, чтобы обеспечить правильное выполнение.