次のようなセットアップがあります。
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(...)
unbindService()
そのことを念頭に置いて、サービスがアンバインドされるように Android がサービスのバインドを解除するが、onServiceDisconnected が呼び出されないため、古い状態のままになる場合はありますか?
また、アプリケーション コンテキストを使用して初期バインディングを行っています。次のようなものと仮定します。
@Override
public void onCreate() {
mApplication = getContext().getApplicationContext();
}