我有一项服务绑定到几个活动,每个活动都使用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
某种方式返回值而不实际调用服务?