본문 바로가기

안드로이드

[안드로이드] 백그라운드 처리

개요

전 문서에서 백그라운드 처리를 위한 컴포넌트인 Service에 대해 알아보았다. 가장 상위 클래스인 Service는 직접 구현하기 어려워 개발자에게 많은 부담이 되었다. 그래서 생긴게 IntentService이다. 상속받아 구현할 메서드도 적고 별도의 쓰레드를 핸들링하지 않아도 되어서 개발자가 훨씬 사용하기 편해졌다. 하지만 단점은 정확하게 동작하지 않고, 여러 작업을 동시에 처리하는 것이 불가능하다. 심지어 Android 11(API 30)부터는 Deprecated 될 예정이다.

 

JobIntentService

JobIntentService는 IntentService를 대체하기 위함이다. 바뀐점은 JobIntentService 안에 구현된 enqueWork()라는 메서드로 서비스를 시작한다. 하지만 단점은 제한시간이 10분이라는 점이다. 10분 안에 끝날 수 있는 작업의 경우 주로 사용된다. 그리고 BIND_JOB_SERVICE 권한이 필요하다.

 

WorkManager

앞에서 소개한 Service, JobIntentService 등 대부분의 서비스를 대체 가능한 API이다. 제한시간에 대한 제약도 없고 쓰레드 핸들링도 없다. 오래 걸리는 작업을 worker라는 객체로 구현한다. 그러면 그 worker를 기반으로 workRequest를 호출하여 동작한다. 이 workRequest는 한번만 수행, 반복수행 등을 선택가능하다. 그리고 네트워크, 배터리 상태 등으로 트리거가 가능하다. 또한, WAKE_LOCK을 자체 관리하므로 권한만 부여하면 된다. 당연히 foreground도 가능하다.

 


백그라운드 처리 가이드

모든 백그라운드 작업은 다음과 같이 세 가지로 나눌 수 있다.

  • 즉시(Immediate): 유저와 어플리케이션이 interactive한 작업
  • 정시(Exact): 특정한 시간에 정확히 수행되어야 하는 작업
  • 지연(Deffered): 위 두 가지 이외에 모든 것. 바로 시작되거나 정시에 시작하지 않아도 되는 작업.

작업의 분류 방법

'즉시'에 해당하는 예시로는 유저가 어떤 버튼을 누를 경우 작업이 바로 시작되는 경우. '정시'는 알람과 같은 경우. '지연'은 유저가 다운로드 버튼을 누르는 경우(3초 뒤에 다운로드가 시작되어도 큰 지장이 없다) 등이 존재한다.

 

위의 작업에 따른 솔루션은 다음과 같다.

  • 즉시: 코루틴, WorkManager(장기 실행 작업)
  • 정시: AlarmManager
  • 지연: WorkManager

카테코리를 알기 쉽게 간단히 하면

  • 간단하고 짧은 작업: WorkManager
  • 긴 작업: WorkManager(Foreground)
  • 긴 작업 + UI 동기화: Service bind + foreground
  • 기존 IntentService: JobIntentService(10분 이내)