У меня есть настройка, которая выглядит примерно так:
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(...)
из возможного предыдущего вызова unbindService()
.
Имеется в виду, есть ли случаи, когда Android отменит для вас ваш сервис так, что сервис станет несвязанным, но onServiceDisconnected не будет вызываться, оставляя меня в безвыходном состоянии?
Кроме того, я использую свой контекст приложения, чтобы сделать начальную привязку. Предположим что-то вроде:
@Override
public void onCreate() {
mApplication = getContext().getApplicationContext();
}