0

我有一项服务绑定到几个活动,每个活动都使用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 其服务已被解除绑定破坏?

如果服务已经被销毁,那我还怎么调用它的函数呢?还是发生了其他事情 -ServiceConnection或以Binder某种方式返回值而不实际调用服务?

4

1 回答 1

0

onServiceDisconnected()只被称为

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

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

为了保持我与服务的正常连接,我建议您在“活动”onResume方法中绑定到该服务,并在该onPause方法中取消与该服务的绑定。

于 2014-08-19T08:43:04.893 回答