我从一些活动中获得了一项服务,每项活动都使用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
以某种方式返回值而不实际调用服务?
答案 0 :(得分:0)
onServiceDisconnected()
仅被称为
当与服务的连接丢失时。这通常会发生 当托管服务的进程崩溃或被杀死时。
引自Android docs。这似乎是一种非常罕见的情况,并且在正常解除服务绑定时不会被调用。