이제 Android 11 개발자 프리뷰를 사용할 수 있습니다. 테스트해 보고 의견을 공유하세요.

백그라운드 처리 가이드

모든 Android 앱에는 측정 뷰와 그리기 뷰를 포함한 UI 처리, 사용자 상호작용 조정 및 수명 주기 이벤트 수신을 담당하는 기본 스레드가 있습니다. 이 스레드에서 작업이 너무 발생하면 앱이 멈추거나 느려진 것 같아 원치 않은 사용자 경험을 초래할 수 있습니다. 비트맵 디코딩, 디스크 액세스 또는 네트워크 요청 수행과 같은 장기 실행 계산과 연산은 별도의 백그라운드 스레드에서 수행해야 합니다. 일반적으로 몇 밀리초 이상 걸리는 작업은 백그라운드 스레드에 위임해야 합니다. 이러한 작업 중 일부는 사용자가 앱과 적극적으로 상호작용하는 동안에 수행해야 할 수 있습니다. 앱이 활발하게 사용되는 동안 기본 UI 스레드가 아닌 백그라운드 스레드에서 작업을 실행하는 방법을 알아보려면 스레딩 솔루션 가이드를 살펴보세요.

애플리케이션은 사용자가 앱을 적극적으로 사용하지 않을 때에도 정기적으로 백엔드 서버와 동기화하거나 정기적으로 앱 내에서 새 콘텐츠를 가져오는 등 일부 작업을 실행해야 할 수도 있습니다. 또한 애플리케이션은 사용자와 앱 간의 상호작용이 끝난 후에도 바로 서비스를 끝까지 실행해야 할 수 있습니다. 이 가이드는 이러한 사용 사례에서 필요 요건에 가장 적합한 솔루션을 파악하는 데 도움이 됩니다.

백그라운드 처리 문제

백그라운드 작업은 RAM, 배터리 같은 기기의 제한된 리소스를 소모합니다. 따라서 백그라운드 작업이 제대로 처리되지 않으면 사용자의 경험이 저하될 수 있습니다.

배터리 수명을 최대화하고 양호한 앱 동작을 구현하기 위해, Android는 앱 또는 포그라운드 서비스 알림이 사용자에게 표시되지 않을 경우 백그라운드 작업을 제한합니다.

  • Android 6.0(API 레벨 23)은 잠자기 모드 및 앱 대기를 도입했습니다. 잠자기 모드는 화면이 꺼져 있고 기기가 정지 상태이면 앱 동작을 제한합니다. 앱 대기는 사용하지 않는 애플리케이션을 네트워크 액세스, 작업 및 동기화를 제한하는 특수한 상태로 만듭니다.
  • Android 7.0(API 레벨 24)은 암시적 브로드캐스트를 제한했으며 이동 중 잠자기 기능을 도입했습니다.
  • Android 8.0(API 레벨 26)은 백그라운드에서 위치를 가져오고 캐시된 wakelock을 해제하는 등 추가로 백그라운드 동작을 제한했습니다.
  • Android 9(API 레벨 28)는 앱 사용 패턴에 따라 앱의 리소스 요청에 동적으로 우선 순위가 부여되는 앱 대기 버킷 을 도입했습니다.

작업을 파악하고 백그라운드 작업 예약 시 시스템 권장사항을 준수하는 올바른 솔루션을 선택하는 것이 중요합니다.

작업에 적합한 솔루션 선택

  • 작업을 연기할 수 있나요? 아니면 즉시 수행해야 하나요? 예를 들어 사용자가 버튼을 클릭하는 동작에 관한 응답으로 개발자가 네트워크에서 데이터를 가져와야 하는 경우 그 작업은 즉시 수행되어야 합니다. 그러나 로그를 서버에 업로드하려는 작업은 앱의 성능이나 사용자의 기대치에 영향을 주지 않고 연기할 수 있습니다.

  • 작업이 시스템 조건에 영향을 받습니까? 전원에 연결되어 있거나 인터넷에 연결되어 있는 등 기기가 특정 조건을 충족할 때에만 작업을 실행하고자 할 수 있습니다. 예를 들어 앱이 저장된 데이터를 주기적으로 압축해야 하는 경우가 있을 수 있습니다. 사용자에게 영향을 주지 않으려면 기기가 충전되고 유휴 상태일 때만 이 작업이 수행되도록 할 수 있습니다.

  • 정확한 시간에 작업을 실행해야 하나요? 캘린더 앱을 사용하면 사용자가 특정 시간에 이벤트 알림을 받도록 설정할 수 있습니다. 정확한 시간에 사용자에게 알림이 표시되어야 합니다. 다른 경우에는 앱은 작업의 실행 시점을 정확하게 처리하지 않을 수 있습니다. 앱은 '먼저 작업 A, 그다음에는 작업 B, 그다음에는 작업 C가 실행되어야 함' 같은 일반적인 필수사항이 있을 수 있지만 작업이 특정 시간에 실행되도록 요구하지는 않습니다.

그림 1. 백그라운드 작업을 수행하는 가장 좋은 방법은 무엇인가요?

WorkManager

지연할 수 있는 작업 중 기기 또는 애플리케이션이 다시 시작될 때에도 실행해야 하는 작업의 경우 WorkManager를 사용합니다. WorkManager는 네트워크 가용성 및 전력과 같은 작업 조건이 충족될 경우, 지연 가능한 백그라운드 작업을 정상적으로 실행하는 Android 라이브러리입니다.

WorkManager는 이전 버전과 호환되는(API 레벨 14 이상) API를 활용하는 JobScheduler API(API 레벨 23 이상) 이상을 제공하기 때문에 배터리 수명과 배치 작업을 최적화하고 더 낮은 기기에서 AlarmManagerBroadcastReceiver를 조합하는 데 유용합니다.

포그라운드 서비스

즉시 실행해서 끝까지 실행해야 하는 사용자 시작 작업의 경우 포그라운드 서비스를 사용합니다. 포그라운드 서비스를 사용하면 앱이 중요한 작업을 수행 중이므로 앱을 종료해서는 안 된다는 메시지가 시스템에 전달됩니다. 포그라운드 서비스는 알림 목록에서 닫을 수 없는 알림 형태로 사용자에게 표시됩니다.

AlarmManager

정확한 시간에 작업을 실행해야 하는 경우 AlarmManager를 사용합니다. 필요한 경우 AlarmManager는 지정된 시간에 작업을 수행하도록 앱을 실행합니다. 그러나 정확한 시간에 작업을 실행하지 않아도 되는 경우에는 WorkManager를 선택하는 것이 더 좋습니다. WorkManager는 시스템 리소스 균형을 맞추는 데 더 효과적입니다. 예를 들어 작업을 매시간 실행해야 하지만 특정 시간에 실행할 필요는 없는 경우 WorkManager를 사용하여 반복 작업을 설정해야 합니다.

DownloadManager

앱이 장기 실행 HTTP 다운로드를 수행하는 경우 DownloadManager를 사용하는 것이 좋습니다. 클라이언트는 앱 프로세스 외부에 있는 특정 대상 파일에 URI를 다운로드하도록 요청할 수 있습니다. 다운로드 관리자는 백그라운드에서 다운로드를 수행하고 HTTP 상호작용을 처리합니다. 또한 다운로드가 실패되거나 연결이 변경되거나 시스템이 재부팅된 후에 다운로드를 다시 시도합니다.