저는 두 가지 활동으로 묶여있는 서비스를 가지고 있는데, 각각 ServiceConnection
을 사용합니다.Android : 바운드 서비스가 언제 삭제되었는지 어떻게 알 수 있습니까?
각 활동은 서비스를 사용하기 전에 서비스가 이미 사용 중인지 확인해야합니다. 따라서 서비스에서 현재 수행중인 서비스의 세부 정보를 반환하는 함수 (예 : getCurrentId()
)가 있습니다. 는 그런 다음 클라이언트 활동, 서비스 연결이 설정됩니다 :
activity.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
및 바인딩 해제 :
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;
}
};
A 버튼 토글이 서비스에 바인딩
activity.unbindService(mConnection);
나는 아니에요 전화는 startService()
입니다. 나는 서비스에 바인딩하기 전에 이미 활성화 그리고 그것은 무엇을하는지 경우
, 내가 확인 :
if (mService == null)
activeId = -1;
else
activeId = mService.getCurrentId();
활동이 결합 다음 서비스에서 바인드 해제하면 문제가이며, 서비스 onDestroy()
메서드가 호출됩니다 (이걸 확인하기 위해 로그인했습니다). BUT이 은 트리거 onServiceDisconnected()
이 아닙니다.
그래서 mService는 null로 설정되지 않으며 if 문에 도달하면 행복하게 전달되고 getCurrentId()
이 호출되어 이전 세부 정보가 반환됩니다.
서비스가 실행중인 스레드가 예기치 않게 종료 될 때 onServiceDisconnected()
이 호출되는 것으로 가정하므로 바인딩 해제를 사용하는 마지막 활동으로 인해 서비스가 파괴 될 때 호출되지 않습니다.
내가 알 수있는 한, 서비스는 다시 인스턴스화되지 않고 있으며, 전반적으로 로깅됩니다. 다른 콜백 함수 또는 ServiceConnection이 서비스가 결합 해제에 의해 파괴 된 것을 통지 어떤 방법이
있습니까 : 나에게 두 가지 질문을 제공
?
서비스 에이 파괴 된 경우 어떻게 계속 기능을 호출 할 수 있습니까? 아니면 실제로 뭔가를 호출하지 않고 ServiceConnection
또는 Binder
값을 반환하는 것입니까? 서비스에 대한 연결이 끊어졌습니다 때
onServiceDisconnected()는 활동이 여전히 바인딩되어있는 동안 서비스가 파괴되면 (예 : 작업이 완료 될 때) 호출됩니다! 이것은 매우 드문 경우는 아닙니다. 그러나 onUnbind() 다음에 onDestroy()가 호출되면 onServiceDisconnected가 호출되지 않습니다. – Bhiefer