안드로이드에서 서비스를 구현하는 동안 START_STICKY
과 차이점은 무엇입니까 START_NOT_STICKY
? 누구나 표준 사례를 지적 할 수 있습니까?
안드로이드에서 서비스를 구현하는 동안 START_STICKY
과 차이점은 무엇입니까 START_NOT_STICKY
? 누구나 표준 사례를 지적 할 수 있습니까?
답변:
두 코드는 전화에 메모리가 부족하고 실행이 끝나기 전에 서비스를 종료 한 경우에만 관련이 있습니다. START_STICKY
충분한 메모리가 확보 된 후 OS에서 서비스를 다시 작성하고 onStartCommand()
널 인 텐트로 다시 호출하도록 OS에 지시합니다 . START_NOT_STICKY
OS가 서비스를 다시 생성하는 것을 방해하지 않도록 지시합니다. START_REDELIVER_INTENT
OS에게 서비스를 재생성하고 동일한 의도를 다시 전달하도록 지시 하는 세 번째 코드도 있습니다 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 ()를 호출하기 전에 서비스 프로세스가 종료 된 경우 해당 의도는 완료 될 때까지 해당 서비스에 다시 전달됩니다 (몇 번 더 시도해도 여전히 완료 할 수없는 경우가 아니라면, 시스템이 포기하는 시점). 이것은 수행 할 작업 명령을받는 서비스에 유용하며 전송 된 각 명령에 대한 작업을 결국 완료하도록합니다.
START_NOT_STICKY
합니까?
START_REDELIVER_INTENT
같다 START_NOT_STICKY
. 대신에START_STICKY
차:
시스템은 서비스가 종료 된 후 서비스를 다시 작성하려고 시도합니다
서비스가 종료 된 후 시스템은 서비스를 다시 작성하려고 시도 하지 않습니다.
표준 예 :
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
START_REDELIVER_INTENT
. START_STICKY
최근에 앱을 테스트 하고 종료했습니다. 그런 다음 서비스를 호출합니다. 그러나 START_REDELIVER_INTENT
다시는 전화하지 않았습니다. 왜?
에 대한 문서 START_STICKY
와는 START_NOT_STICKY
매우 간단합니다.
이 서비스의 프로세스가 시작되는 동안
onStartCommand(Intent, int, int))
종료 된 경우 (에서 복귀 한 후 시작된 상태로 유지하지만 전달 된 의도를 유지하지 마십시오. 나중에 시스템이 서비스를 다시 작성하려고 시도합니다. 시작된 상태에 있기 때문에onStartCommand(Intent, int, int)
새 서비스 인스턴스를 만든 후 호출 을 보장 합니다. 서비스에 전달할 보류중인 시작 명령이없는 경우 널 의도 오브젝트로 호출되므로이를 확인해야합니다.이 모드는 백그라운드 음악 재생을 수행하는 서비스와 같이 임의의 시간 동안 명시 적으로 시작 및 중지 된 항목에 적합합니다.
예 : 로컬 서비스 샘플
이 서비스의 프로세스가 시작된 동안 종료 된 후 (에서 복귀 한 후
onStartCommand(Intent, int, int))
서비스를 제공 할 새로운 시작 의도가없는 경우 서비스를 시작된 상태에서 해제하고 향후 명시적인 호출이있을 때까지 다시 작성하지 마십시오Context.startService(Intent)
. 보류중인 인 텐트가없는 경우 다시 시작되지 않으므로 인 텐트 가 포함 된onStartCommand(Intent, int, int)
전화를 받지null
않습니다.이 모드는 시작된 결과로 일부 작업을 수행하려는 작업에 적합하지만 메모리 부족시 중지 될 수 있으며 나중에 더 많은 작업을 수행하기 위해 명시 적으로 다시 시작됩니다. 이러한 서비스의 예로는 서버에서 데이터를 폴링하는 서비스가 있습니다
N
. 알람이 서비스를 시작하도록하여 매 분 마다 폴링하도록 알람을 예약 할 수 있습니다.onStartCommand(Intent, int, int)
알람에서 호출 되면 N 분 후에 새 알람을 예약하고 네트워킹을 수행하기 위해 스레드를 생성합니다. 해당 검사를 수행하는 동안 프로세스가 종료되면 경보가 울릴 때까지 서비스가 다시 시작되지 않습니다.