Android:如何判断绑定服务何时被销毁?

时间:2014-02-27 22:03:22

标签: android service serviceconnection android-service-binding

我从一些活动中获得了一项服务,每项活动都使用ServiceConnection

在调用服务之前,每个活动都需要检查服务是否已在使用中。所以在服务中我有一个函数(比如getCurrentId()),它返回服务当前正在做什么的细节。 然后在客户端活动中,设置服务连接:

private MyService mService = null;
private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder binder) {
        MyService.MyBinder myBinder = (MyService.MyBinder) binder;
        mService = myBinder.getService();
        activeId = mService.getCurrentId();
        log.i(TAG, "Service bound" );
    }
    public void onServiceDisconnected(ComponentName className) {
        log.i(TAG, "Service has been killed");
        mService = null;
    }
};  

按钮切换与服务的绑定:

activity.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

和取消绑定:

activity.unbindService(mConnection);

我根本不打电话给startService()

在我绑定服务之前,我会检查它是否已经处于活动状态以及它正在做什么:

if (mService == null)
    activeId = -1;
else
    activeId = mService.getCurrentId();

问题是,如果活动绑定到服务然后解除绑定,则调用服务onDestroy()方法(我已登录以确认此情况),这是精细。 但是不会触发onServiceDisconnected()

所以mService永远不会设置为null,当我到达if语句时,它会愉快地继续并调用getCurrentId(),它会返回之前的详细信息。

我认为只有当服务运行的线程被意外杀死时才应该调用onServiceDisconnected(),所以当服务因使用它解除绑定的最后一个活动而被销毁时,它是不正确的。

据我所知,该服务尚未重新实现,我已经在整个过程中进行了日志记录。

这给了我两个问题:

是否有替代回调函数或某种方式通知ServiceConnection其服务已被解除绑定销毁?

如果服务已经销毁,那么我该如何调用其功能呢?或者是其他事情发生了 - ServiceConnectionBinder以某种方式返回值而不实际调用服务?

1 个答案:

答案 0 :(得分:0)

onServiceDisconnected()仅被称为

  

当与服务的连接丢失时。这通常会发生   当托管服务的进程崩溃或被杀死时。

引自Android docs。这似乎是一种非常罕见的情况,并且在正常解除服务绑定时不会被调用。

为了保持与服务理智的联系,我建议您在活动onResume方法中绑定该服务,并使用onPause方法解除绑定。