START_STICKY 및 START_NOT_STICKY


답변:


371

두 코드는 전화에 메모리가 부족하고 실행이 끝나기 전에 서비스를 종료 한 경우에만 관련이 있습니다. START_STICKY충분한 메모리가 확보 된 후 OS에서 서비스를 다시 작성하고 onStartCommand()널 인 텐트로 다시 호출하도록 OS에 지시합니다 . START_NOT_STICKYOS가 서비스를 다시 생성하는 것을 방해하지 않도록 지시합니다. START_REDELIVER_INTENTOS에게 서비스를 재생성하고 동일한 의도를 다시 전달하도록 지시 하는 세 번째 코드도 있습니다 onStartCommand().

Dianne Hackborn의이 기사는 공식 문서보다 이것의 배경을 훨씬 잘 설명했습니다.

출처 : http://android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html

여기서 핵심 부분은 함수가 반환 한 새로운 결과 코드로, 시스템이 실행되는 동안 프로세스가 종료 된 경우 서비스로 수행해야 할 작업을 시스템에 알려줍니다.

START_STICKY는 기본적으로 서비스가 "시작된"상태로 유지되고 나중에 시스템에 의해 다시 시작되는 이전 동작과 동일합니다. 이전 버전의 플랫폼과의 유일한 차이점은 프로세스가 종료되어 다시 시작되면 서비스의 다음 인스턴스에서 onStartCommand ()가 호출되지 않고 null 의도로 호출된다는 것입니다. 이 모드를 사용하는 서비스는 항상이 경우를 확인하고 적절하게 처리해야합니다.

START_NOT_STICKY는 onStartCreated ()에서 복귀 한 후 전달할 나머지 시작 명령없이 프로세스가 종료되면 서비스가 다시 시작되지 않고 중지된다고 말합니다. 전송 된 명령을 실행하는 동안에 만 실행되도록되어있는 서비스에 훨씬 적합합니다. 예를 들어, 알람에서 일부 네트워크 상태를 폴링하기 위해 15 분마다 서비스가 시작될 수 있습니다. 해당 작업을 수행하는 동안 시스템이 종료되면 다음에 알람이 발생할 때 중지하고 시작하는 것이 가장 좋습니다.

START_REDELIVER_INTENT는 START_NOT_STICKY와 같습니다. 특정 의도에 대해 stopSelf ()를 호출하기 전에 서비스 프로세스가 종료 된 경우 해당 의도는 완료 될 때까지 해당 서비스에 다시 전달됩니다 (몇 번 더 시도해도 여전히 완료 할 수없는 경우가 아니라면, 시스템이 포기하는 시점). 이것은 수행 할 작업 명령을받는 서비스에 유용하며 전송 된 각 명령에 대한 작업을 결국 완료하도록합니다.


1
작업을 두 번 호출하지 않도록하는 방법 handleStart (intent, startId); onStart () 및 onStartCommand가 모두 호출됩니까? 좋은 디자인입니까? @ 프랭크 리
Sazzad Hissain Khan

2
그러나 기본 플래그가 지정되지 않은 경우 무엇입니까?
IgorGanapolsky

3
"return super.onStartCommand (...);"를 따른다면 대상 SDK 버전이 기본적으로 ECLAIR (API5 = 2.0)보다 작은 경우 START_STICKY_COMPATIBILITY가 반환되고 2.0 이상에서 START_STICKY가 반환됩니다.
MikeL

1
에서 "시작 명령이 남아 있지 않음"은 무엇을 의미 START_NOT_STICKY합니까?
Malwinder Singh

3
나는 동의하지 않는다 @FrankLeigh START_REDELIVER_INTENT같다 START_NOT_STICKY. 대신에START_STICKY
CopsOnRoad

107

키스 답변

차:

START_STICKY

시스템은 서비스가 종료 된 후 서비스를 다시 작성하려고 시도합니다

START_NOT_STICKY

서비스가 종료 된 후 시스템은 서비스를 다시 작성하려고 시도 하지 않습니다.


표준 예 :

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

5
이것은 실제로 정확하고 혼란스럽지 않습니다. "서비스가 종료되었습니다"라고 말하는 것은 실수입니다. 왜냐하면 프로세스 종료를 분명히 언급하면서 stopSelf 또는 stopService를 참조한다고 생각할 수 있기 때문입니다. 그래서 당신은 당신의 대답에 단어 과정을 사용하는 것이 좋습니다.
Ilya Gazman

안녕하세요 어떻게 테스트 할 수 있습니다 START_REDELIVER_INTENT. START_STICKY최근에 앱을 테스트 하고 종료했습니다. 그런 다음 서비스를 호출합니다. 그러나 START_REDELIVER_INTENT다시는 전화하지 않았습니다. 왜?
Asif Mushtaq

@IlyaGazman 나는 정중하게 동의하지 않습니다. 멈추고 죽인 것은 매우 다른 두 단어입니다. 이 답변은 문제를 간단하고 간단하게 올바르게 설명합니다.
NoHarmDan

23

에 대한 문서 START_STICKY와는 START_NOT_STICKY매우 간단합니다.

START_STICKY :

이 서비스의 프로세스가 시작되는 동안 onStartCommand(Intent, int, int))종료 된 경우 (에서 복귀 한 후 시작된 상태로 유지하지만 전달 된 의도를 유지하지 마십시오. 나중에 시스템이 서비스를 다시 작성하려고 시도합니다. 시작된 상태에 있기 때문에 onStartCommand(Intent, int, int) 새 서비스 인스턴스를 만든 후 호출 을 보장 합니다. 서비스에 전달할 보류중인 시작 명령이없는 경우 널 의도 오브젝트로 호출되므로이를 확인해야합니다.

이 모드는 백그라운드 음악 재생을 수행하는 서비스와 같이 임의의 시간 동안 명시 적으로 시작 및 중지 된 항목에 적합합니다.

예 : 로컬 서비스 샘플

START_NOT_STICKY :

이 서비스의 프로세스가 시작된 동안 종료 된 후 (에서 복귀 한 후 onStartCommand(Intent, int, int))서비스를 제공 할 새로운 시작 의도가없는 경우 서비스를 시작된 상태에서 해제하고 향후 명시적인 호출이있을 때까지 다시 작성하지 마십시오 Context.startService(Intent). 보류중인 인 텐트가없는 경우 다시 시작되지 않으므로 인 텐트 가 포함 된 onStartCommand(Intent, int, int)전화를 받지 null않습니다.

이 모드는 시작된 결과로 일부 작업을 수행하려는 작업에 적합하지만 메모리 부족시 중지 될 수 있으며 나중에 더 많은 작업을 수행하기 위해 명시 적으로 다시 시작됩니다. 이러한 서비스의 예로는 서버에서 데이터를 폴링하는 서비스가 있습니다 N. 알람이 서비스를 시작하도록하여 매 분 마다 폴링하도록 알람을 예약 할 수 있습니다. onStartCommand(Intent, int, int)알람에서 호출 되면 N 분 후에 새 알람을 예약하고 네트워킹을 수행하기 위해 스레드를 생성합니다. 해당 검사를 수행하는 동안 프로세스가 종료되면 경보가 울릴 때까지 서비스가 다시 시작되지 않습니다.

예 : ServiceStartArguments.java


행운을 빕니다.. 나는 문서를 평신도의 말로 연관시킬 수 없었다. 실시간 시나리오와 관련이 있습니다. 장치에 대한 예를 보여 드리고자합니다. 더 쉽게 이해할 수 있도록
prago

START_STICKY 및 START_NOT_STICKY의 경우 onStartCommand ()는 한 번만 실행되어 나옵니다. 나는 샘플 u가 지적한 것을 보았지만, 의심의 여지가 onStartCommand ()가 몇 번 실행될 것인지입니다. START_STICKY를 취소하고 여전히 서비스를 다시 만들려고하면 서비스가 onStartCommand를 실행 한 다음 ??
prago 2012

서비스를 다시 만들면 어떻게됩니까? 활동도 다시 작성됩니까?
ransh

우리는 절대 알지 못할 것 같습니다
Denny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.