programing

START_STICKY 및 START_NOT_STICKY

starjava 2023. 8. 25. 23:11
반응형

START_STICKY 및 START_NOT_STICKY

안드로이드에서 서비스를 구현하는 동안 와의 차이점은 무엇입니까?표준적인 예를 지적해주실 분 있나요??

두 코드 모두 전화기의 메모리가 부족하여 실행이 완료되기 전에 서비스를 종료하는 경우에만 관련이 있습니다.START_STICKY를 호출한 후 합니다.onStartCommand()또다시 무의미한 의도가 없는.START_NOT_STICKYOS에 서비스를 다시 만들지 말라고 합니다.세 번째 코드도 있습니다.START_REDELIVER_INTENT를 다시 를 OS에 다시 하도록 OS에 합니다.onStartCommand().

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

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

여기서 중요한 부분은 함수가 반환한 새 결과 코드로, 실행 중에 프로세스가 중단될 경우 서비스에 대해 수행해야 할 작업을 시스템에 알려줍니다.

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

START_NOT_STICKY는 onStartCreated()에서 돌아온 후 프로세스가 종료되고 남은 시작 명령이 전달되지 않으면 서비스가 다시 시작되지 않고 중지된다고 말합니다.이렇게 하면 전송된 명령을 실행하는 동안만 실행되는 서비스에 훨씬 적합합니다.예를 들어, 일부 네트워크 상태를 폴링하기 위해 경보로부터 15분마다 서비스를 시작할 수 있습니다.만약 그 작업을 하다가 죽는다면, 그냥 멈춰서 다음 번에 경보가 울릴 때 시작하는 것이 가장 좋을 것입니다.

시작_재전송_INTITE는 START_NOT_STICKY와 같습니다. 단, 서비스 프로세스가 지정된 의도에 대해 stopSelf()를 호출하기 전에 종료되는 경우에는 해당 의도가 완료될 때까지 다시 전달됩니다(몇 번 더 시도한 후에도 시스템이 완료되지 않는 경우는 제외).이 기능은 작업 명령을 수신하고 전송된 각 명령에 대해 작업을 완료하려는 서비스에 유용합니다.

KISS 답변

차이:

START_STICKY

서비스가 종료된 후 시스템이 서비스를 다시 생성하려고 합니다.

START_NOT_STICKY

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


표준 예:

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

다음에 대한 설명서START_STICKY그리고.START_NOT_STICKY아주 간단합니다.

시작_스티키:

서비스가 시작되는 동안 이 서비스의 프로세스가 중지된 경우(에서 돌아온 후)onStartCommand(Intent, int, int))그런 다음 시작 상태로 유지하되 전달된 의도는 유지하지 않습니다.나중에 시스템이 서비스를 다시 생성하려고 시도합니다.시작 상태이므로 통화를 보장합니다.onStartCommand(Intent, int, int)새 서비스 인스턴스를 생성한 후 서비스에 전달할 보류 중인 시작 명령이 없으면 null 의도 개체로 호출되므로 이를 확인해야 합니다.

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

예: 로컬 서비스 샘플

시작_NOT_STICKY:

서비스가 시작되는 동안 이 서비스의 프로세스가 중지된 경우(에서 돌아온 후)onStartCommand(Intent, int, int))이 서비스에 제공할 새로운 시작 의도가 없습니다. 서비스를 시작 상태에서 해제하고 나중에 명시적으로 요청할 때까지 재생성하지 마십시오.Context.startService(Intent)서비스가 다음을 수신하지 않습니다.onStartCommand(Intent, int, int)전화를 걸다null전달할 보류 중인 의도가 없으면 다시 시작되지 않으므로 의도입니다.

이 모드는 시작으로 인해 일부 작업을 수행하려는 작업에 적합하지만 메모리 부담이 있을 때 중지될 수 있으며 나중에 더 많은 작업을 수행하기 위해 직접 다시 시작합니다.이러한 서비스의 예로는 서버의 데이터를 폴링하는 서비스를 들 수 있습니다. 다음 시간마다 폴링하도록 알람을 예약할 수 있습니다.N알람이 서비스를 시작하도록 함으로써 분 단위로 설정할 수 있습니다.그것이 언제onStartCommand(Intent, int, int)는 경보에서 호출되고, N분 후에 새 경보를 예약하며, 네트워킹을 수행할 스레드를 생성합니다.해당 검사를 수행하는 동안 프로세스가 중지되면 경보가 울릴 때까지 서비스가 다시 시작되지 않습니다.

예:ServiceStartArguments.java

  • START_STICKY서비스가 종료된 경우 서비스를 다시 시작하고 서비스에 전달되는 Intent 데이터를onStartCommand()는 은법입니다.NULL이것은 명령을 실행하지 않고 독립적으로 실행되고 작업을 대기하는 서비스에 적합합니다.
  • START_NOT_STICKY서비스를 다시 시작하지 않으며 주기적으로 실행되는 서비스에 유용합니다. 중인 보류중경서비다가가 됩니다.startService()필요하지 않을 경우 서비스를 실행하지 않는 것이 가장 좋습니다.
  • START_REDELIVER_INTENT은 같다니습과 STAR_STICKY그리고 그것은 서비스를 다시 만듭니다, 전화.onStartCommand()마지막 목적으로 서비스에 전달되었습니다.

언급URL : https://stackoverflow.com/questions/9093271/start-sticky-and-start-not-sticky

반응형