IAE:服务未在Service.stopSelf之后的unbindService上注册

时间:2014-11-11 13:23:21

标签: android service android-service android-service-binding

我正在绑定到JavaDoc

中展示的Android服务
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将无济于事。

2 个答案:

答案 0 :(得分:2)

在大多数情况下,您希望在活动绑定到服务时运行服务。这种情况的解决方案 - 将标志BIND_AUTO_CREATE添加到服务绑定调用和服务将一直运行,直到你调用unbind,即使调用了stopService或stopSelf。

否则,据我所知,唯一的选择是捕获异常。

答案 1 :(得分:0)

当您在服务中致电stopSelf()时,您的onSerivceDisconnected()将被调用

因此,在bound

false中将onSerivceDisconnected()值更改为Activity
 @Override
public void onServiceDisconnected(ComponentName name) {
    Log.i(TAG, "Service disconnected");
    bound=false;
    service = null;
}