2012-11-05 4 views
1

시스템에 의해 멈추었을 때 안드로이드 서비스가 어떻게 동작하는지에 대한 질문이 있습니다. 내 이해에 따라 시스템 (OS)이 필요한 리소스로 인해 서비스를 중지하면 다시 시작하는 것이 시스템의 책임입니다. 이 시나리오에서 시스템은 서비스를 중지 할 때 onDestroy()를 호출하지 않고 서비스를 시작할 때 onCreate()를 호출하지 않고 onStartCommand()를 호출합니다.시스템에 의해 중지되었을 때 안드로이드 서비스가 응답하는 방법

onStartCommand()에서 스레드를 만들 경우 시스템이 서비스를 중지 할 때 스레드를 정리하는 방법은 무엇입니까? 스레드를 중지하지 않으면 onStartCommand()는 새 스레드를 만듭니다. 생각해 보면, onStartCommand() 매개 변수 (intent, flags 및 startId)가 나타날 수 있습니다. 리소스가 필요하기 때문에 시스템을 중지 한 후 서비스가 시작될 때 시스템이 다를 수 있습니다. 어떤 사람이 서비스가 startService() 명령 또는 시스템 자체 (중지 후)에 의해 시작될 때 매개 변수의 차이점을 말해 줄 수 있습니까?

onCreate()에서 스레드를 만들 수 있지만 시스템이있을 때 스레드가 여전히 있는지 여부는 확실하지 않습니다. 서비스를 중지합니다. 이런 종류의 시나리오를 처리하는 가장 좋은 방법은 무엇입니까? 시스템 (OS)을 인해 필요한 자원에 서비스를 중지하는 경우

감사

내 이해 당으로

답변

2

, 그것은 시스템의 책임을 다시 시작하는 것입니다.

이는 사용자가 onStartCommand()에서 반환하는 내용에 따라 다릅니다. 예를 들어, START_NOT_STICKY은 OS가 서비스를 다시 시작할 필요가 없음을 의미합니다.

이 경우 시스템은 서비스를 중지 할 때 onDestroy()를 호출하지 않고 서비스를 시작할 때 onCreate()를 호출하지 않고 onStartCommand()를 호출합니다.

onDestroy()을 호출할지 여부는 서비스 중단 방법 (예 : 직접 또는 프로세스 종료)에 따라 약간 달라집니다. 그러나 OS가 서비스를 다시 시작하는 경우 새 인스턴스에서 여전히 onCreate()을 호출해야합니다.

onStartCommand()에서 스레드를 만들 경우 시스템이 서비스를 중지 할 때 스레드를 정리하는 방법은 무엇입니까?

onDestroy()에 무엇인가가 발생하면 스레드가 사라질 수 있습니다. onDestroy()이 호출되거나 서비스가 정리를 수행 할 수 있거나 프로세스가 종료되고 스레드가 사라집니다.

사람이

가 전달 된 플래그에있을 것 START_FLAG_REDELIVERY이 서비스를 (을 중지 한 후) startService() 명령 또는 시스템 자체에 의해 시작 매개 변수의 차이 일 것입니다 무슨 말해 수 onStartCommand()으로 설정하고 AFAIK는 START_REDELIVER_INTENTonStartCommand()에서 반환하는 경우에만 설정됩니다.

+0

감사합니다. CommonsWare. 따라서 시스템은 서비스 중단 방법에 관계없이 항상 onCreate()를 호출합니다. 불행히도, 시스템이 서비스를 중지하지만 onDestroy() 또는 onCreate()를 호출하지 않고 onStartCommand()를 직접 호출하면 인스턴스를 (로깅을 통해) 보았습니다. 이러한 시나리오를 어떻게 처리합니까? – Androidme

+0

@bsengar : "불행히도, 시스템이 서비스를 중지하지만 onDestroy() 또는 onCreate()를 호출하지 않고 onStartCommand()를 직접 호출하면 인스턴스를 보았습니다 (로깅을 통해)"- 샘플 응용 프로그램을 제공하고 이 문제를 나타내는 문제를 재현 할 수 있습니다. – CommonsWare

+0

샘플 서비스를 작성하고 onCreate(), onStartCommand() 및 onDestroy()에 로그온하여 쉽게 테스트 할 수 있습니다. 부팅 할 때 서비스를 시작하십시오. 약 10 시간 후에 서비스 상태를 확인하면 서비스가 2 시간 동안 실행될 수 있습니다. 그러나 로그 파일을 확인하면 추가 onStartCommand() 호출이 아니라 onDestroy() 또는 onCreate() 호출을 볼 수 없습니다. – Androidme

관련 문제