개발/Android

[안드로이드] START_STICKY & START_NOT_STICKY

로키입니다 2022. 5. 24. 23:45

🎈 안드로이드 서비스

오늘 알아볼 것은 안드로이드 서비스에서 주로 사용되는 세가지 시작 방법에 대한 정보입니다.
START_STICKY, START_NOT_STICKY, START_REDELIVER_INTENT가 있으며, 각각에 대해 자세히 알아보겠습니다.
 

✔️ START_STICKY

  • 서비스가 강제로 종료되었을 때 시스템이 자동으로 다시 시작하도록 하는 방식입니다.
  • 서비스가 다른 추가적인 작업 없이도 계속 실행되어야 하는 경우에 주로 사용됩니다.
  • 시스템에 의해 재시작되면 onStartCommand()가 호출되지만 Intent는 Null이 전달됩니다.

 

✔️ START_NOT_STICKY

  • 서비스가 강제로 종료되었을 때 시스템이 자동으로 다시 시작하지 않도록 하는 방식입니다.
  • 이 방식은 서비스가 특정 작업을 완료한 후에는 더 이상 실행되지 않아도 되는 경우에 주로 사용됩니다.
  • 시스템 자원 부족으로 서비스가 강제종료되어도 문제가 없는 경우에 사용됩니다.

 

✔️ START_REDELIVER_INTENT

  • 서비스가 강제로 종료되었을 때 시스템이 자동으로 다시 시작하고, 마지막으로 전달된 Intent를 다시 전달해주는 방식입니다.
  • 서비스가 실행 중인 작업을 반드시 완료해야 하는 경우에 주로 사용됩니다.
  • 마지막으로 전달된 Intent가 다시 동일하게 전달되므로 취소된 작업을 이어서 수행할 수 있습니다.
  • 하지만 그만큼 시스템 자원을 더 사용하기 때문에 필수적인 작업의 완료를 보장하고 싶을 때에만 사용해야 합니다.

 

✔️ 각 Flag 사용 예시

  1. START_STICKY
    • 백그라운드 음악 재생 서비스: 백그라운드에서 계속 음악을 재생해야 합니다.
    • 위치 정보 추적 서비스: 사용자의 위치 정보를 계속 추적해야 합니다.
  2. START_NOT_STICKY
    • 파일 다운로드 서비스: 사용자가 요청한 파일을 다운로드한 후에는 서비스가 종료되어도 됩니다.
    • 일회성 작업 수행 서비스: 일회성 작업 수행 후에는 서비스가 종료되어도 무관합니다.
  3. START_REDELIVER_INTENT
    • 네트워크 요청 서비스: 서버 통신을 수행하는 경우, 네트워크 상태가 불안정하거나 실패했을 때에도 다시 시작해야 합니다. 이 때 마지막으로 전달한 Intent를 그대로 다시 전달받아 작업을 이어서 수행할 수 있도록 합니다.
    • 긴 작업 수행 서비스: 작업 수행에 긴 시간이 소요되는 서비스에서는 해당 작업이 완료되지 않았을 경우에 작업을 다시 시작해야 합니다.

 

✔️ 각 Flag 두줄 요약

  1. START_STICKY
    1. 서비스가 지속적으로 실행되어야 할 경우에 적합합니다.
    2. 시스템에 의해 재시작되지만 Intent는 NULL이 전달됩니다.
  2. START_NOT_STICKY
    1. 서비스가 작업을 완료한 후 실행되지 않아도 되는 경우에 적합합니다.
    2. 시스템에 의해 재시작되지 않습니다.
  3. START_REDELIVER_INTENT
    1. 서비스가 실행 중인 작업을 반드시 완료해야 하는 경우에 적합합니다.
    2. 시스템에 의해 재시작되며, 마지막으로 전달했던 Intent를 전달합니다.