2011-08-29 2 views
46

안드로이드에서 Activity의 라이프 사이클 다이어그램은 onDestroy()가 호출되는 것을 보증하지 않지만 프로세스가 종료되고 Activity가 갑자기 제거 될 수 있음을 보증합니다. android의 Service의 라이프 사이클 다이어그램은 onDestroy()가 호출 될 것을 보장합니다. 그래서이 차이점과 관련된 두 가지 질문이 있습니다.안드로이드 서비스가 onDestroy()를 호출하도록 보장되어 있습니까?

먼저 서비스가 활동과 동일한 프로세스의 일부인 경우 Activity onDestroy()가 호출되지 않더라도 서비스 onDestroy()가 호출됩니까? 나는 "프로세스를 죽이는 것"이 ​​운영체제가 스레드를 멈추고 리소스를 해제하고 있음을 암시한다고 생각하지 않을 것이다.

그런 경우 서비스 단독 프로세스가 OS에 의해 갑자기 종료 될 수 있습니까?

답변

29

서비스에 onDestroy()이 부르심을받은 곳이 어디 있는지 확실하지 않습니다. 내가 아는 한, 이것은 사실이 아닙니다. 문서의 this 페이지를 읽으면 서비스가 종료 될 수있는 조건을 설명합니다. 따라서 액티비티와 서비스를 모두 호스팅하는 프로세스가 죽는 지 묻는다면 서비스에서 (서비스가 아니라) onDestroy()을 호출 할 것이고 대답은 아니오입니다. 서비스의 onDestroy()이 반드시 호출되는 것은 아닙니다. 서비스 전용 프로세스가 OS에 의해 갑작스럽게 죽을 수 있는지 여부에 관해서는 그렇습니다. 특히 많은 작업을 수행해야하는 경우에 특히 그렇습니다. onStartCommand 호출은 비동기 적으로 작업을 대기시킵니다. 그런 다음 서비스는 보호 된 onCreate, onStartCommand 또는 onDestroy 방법이 아닌 대부분의 시간을 소비하게됩니다. 고려해야 할 두 가지가 있습니다

+0

링크가 내가보고 싶었던 것입니다. 감사! 나는 라이프 사이클 다이어그램을 보면서 혼란 스러웠다. 하나는 프로세스가 죽었고 다른 하나는 죽지 않았기 때문이다. 그러나 나는 후자가 내포되었다고 생각했다. 내 생각을 어디에서 확인해야할지 몰랐습니다. – user574771

+1

종료하기 전에 서비스를 정리해야 할 때 알림을받는 방법은 무엇입니까? 예를 들어, 어떤 상태를 캐시에 저장하고 종료하기 전에 저장소로 플러시하려고합니다. 나는 내가 쉴 틈이 없다는 말을 결코 듣지 않으면 나는 나의 상태를 잃을 것이다. – Michael

+1

@Michael 데이터가 변경 될 때마다 정기적으로 스토리지로 플러시를 고려하십시오. 그것은 합리적인 질문입니다. 사실 내 간단한 대답이 당신을 만족시키지 못한다면, 이것에 대한 자신 만의 질문을 게시하여 좋은 답변을 얻을 가치가 있습니다. – kabuko

10

이 경우 onDestroy()에서

  1. Android might decide to shut down a process at some point, when memory is low and required by other processes that are more immediately serving the user. Application components running in the process that's killed are consequently destroyed. A process is started again for those components when there's again work for them to do.안드로이드 OS 어쨌든 자원을 재생하므로를 호출되지 않습니다 (이것은 일반적으로 OS의 기본 작업입니다 - 경우에 당신은하지 않습니다 알고).
  2. A service can be both started and have connections bound to it. In such a case, the system will keep the service running as long as either it is started or there are one or more connections to it with the Context.BIND_AUTO_CREATE flag. Once neither of these situations hold, the service's onDestroy() method is called and the service is effectively terminated. All cleanup (stopping threads, unregistering receivers) should be complete upon returning from onDestroy(). 그래서 안드로이드 OS가 서비스가 끝났으며 더 이상 필요하지 않다는 것을 안드로이드 OS가 알게되면 안드로이드 OS에 의해 destree 될 것입니다. Android OS는 개발자에게 메모리 누수가 발생하지 않도록 Service의 리소스를 공개 할 수있는 기회를 제공합니다. 이 경우 onDestroy()은 개발자가 리소스를 릴리스 할 수있는 곳이기 때문에이라고합니다. 물론이 경우 응용 프로그램의 프로세스는 그대로 유지됩니다 (다른 서비스/활동이 실행될 수 있으므로).
+0

'한번도 이런 상황이 안되요! '= 보장'! ='항상' –

+0

그래서? 이 의견은 무엇에 관한 것입니까? 공식 문서의 일부를 인용하셨습니까? –

+0

나는 공식 문서의 동일한 부분을 인용했다. '일단 이러한 상황이 발생하지 않으면 서비스의 onDestroy() 메소드가 호출됩니다.' 여전히 두 상황이 모두 onDestroy가 호출되지 않아도 서비스가 중단되지 않더라도 살해되지 않는다는 것을 의미합니다. 그리고 실제로 그것은 사실 일 것입니다. –

관련 문제