我正在绑定到一个android服务,如JavaDoc 中所示
private boolean bound = false;
private MyService service = null;
private final ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(TAG, "Service connected");
service = (MyService) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i(TAG, "Service disconnected");
service = null;
}
};
@Override
public void onResume() {
super.onResume();
Intent intent = new Intent(this, MyService.class);
if (bindService(intent, connection, Context.BIND_ABOVE_CLIENT)) {
bound = true;
} else {
Log.w(TAG, "Service bind failed");
}
}
@Override
public void onPause() {
if (bound) {
unbindService(connection);
bound = false;
}
super.onPause();
}
有时,服务停止调用stopSelf
或被stopService
停止,导致所有客户端都被解除绑定。但是这里的变量bound
仍然为真,因此onPause
将抛出以下异常:
java.lang.IllegalArgumentException: Service not registered: de.ncoder.sensorsystem.android.app.MainActivity$1@359da29
at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1022)
at android.app.ContextImpl.unbindService(ContextImpl.java:1802)
at android.content.ContextWrapper.unbindService(ContextWrapper.java:550)
at de.ncoder.sensorsystem.android.app.MainActivity.onPause(MainActivity.java:121)
at android.app.Activity.performPause(Activity.java:6044)
...
有没有一种简单的方法可以检查服务是否仍然绑定和活动?据我所知,onServiceDisconnected
将保持绑定处于活动状态(因为它只在极端情况下调用,希望服务很快就会重新启动),因此将bound
设置为false没有帮助。
在大多数情况下,您希望在活动绑定到服务时运行服务。这种情况下的解决方案-将标志bind_AUTO_CREATE添加到服务绑定调用中,即使调用了stopService或stopSelf,服务也将运行,直到您调用unbind。
否则,据我所知,唯一的选择就是捕获异常。
当您在服务中调用stopSelf()
时,您的onSerivceDisconnected()
将被调用
因此,在Activity
的onSerivceDisconnected()
中将bound
值更改为false
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i(TAG, "Service disconnected");
bound=false;
service = null;
}