백그라운드 작업 개요

앱은 한 번에 두 가지 이상의 작업을 해야 하는 경우가 많습니다. Android API는 이를 수행하는 다양한 방법을 제공합니다. 적절한 옵션을 선택하는 것은 매우 중요합니다. 한 상황에서는 적절한 옵션이 다른 상황에서는 매우 잘못된 옵션일 수 있습니다. 잘못된 API를 선택하면 앱의 성능이나 리소스 효율성이 저하되어 배터리가 소모되고 사용자 기기 전체의 성능이 저하될 수 있습니다. 잘못된 접근 방식을 선택하면 앱이 Play 스토어에 표시되지 않을 수도 있습니다.

이 문서에서는 사용 가능한 다양한 옵션을 설명하고 상황에 적합한 옵션을 선택하는 데 도움이 됩니다.

용어

백그라운드 작업과 관련된 몇 가지 중요한 용어는 모순되게 여러 가지 방식으로 사용될 수 있습니다. 따라서 Google의 약관을 정의하는 것이 중요합니다.

앱이 백그라운드에서 실행 중인 경우 시스템은 앱에 여러 제한사항을 적용합니다. 예를 들어 대부분의 경우 백그라운드의 앱은 포그라운드 서비스를 실행할 수 없습니다.

이 문서에서는 앱이 기본 워크플로 외부에서 실행하는 작업을 지칭할 때 '작업'이라는 용어를 사용합니다. 이해의 일치를 위해 이를 비동기 작업, 작업 예약 API, 포그라운드 서비스라는 세 가지 주요 작업 유형 카테고리로 분류했습니다.

올바른 옵션 선택

대부분의 시나리오에서는 태스크가 속한 카테고리 (비동기 작업, 작업 예약 API 또는 포그라운드 서비스)를 파악하여 태스크에 사용할 적절한 API를 파악할 수 있습니다.

여전히 확실하지 않다면 Google에서 제공하는 플로우 차트를 사용하여 결정에 더 많은 맥락을 추가할 수 있습니다. 이러한 각 옵션은 이 문서의 뒷부분에서 자세히 설명합니다.

백그라운드 작업에는 두 가지 주요 시나리오가 있습니다.

이 두 시나리오에는 자체 결정 트리가 있습니다.

비동기 작업

대부분의 경우 앱은 포그라운드에서 실행되는 동안 동시 작업을 실행하기만 하면 됩니다. 예를 들어 앱에서 시간이 오래 걸리는 계산을 실행해야 할 수 있습니다. UI 스레드에서 계산을 실행하면 계산이 완료될 때까지 사용자가 앱과 상호작용할 수 없게 되며, 이로 인해 ANR 오류가 발생할 수 있습니다. 이 경우 앱은 비동기 작업 옵션을 사용해야 합니다.

일반적인 비동기 작업 옵션에는 Kotlin 코루틴과 Java 스레드가 있습니다. 비동기 작업 문서에서 자세한 내용을 확인하세요. 백그라운드 작업 API와 달리 앱이 유효한 수명 주기 단계에서 중지되면 (예: 앱이 포그라운드를 종료하는 경우) 비동기 작업이 완료되지 않을 수 있다는 점에 유의해야 합니다.

작업 예약 API

태스크 예약 API는 사용자가 앱을 종료해도 계속 실행해야 하는 태스크를 실행해야 할 때 더 유연한 옵션입니다. 대부분의 경우 백그라운드 태스크를 실행하는 가장 좋은 방법은 WorkManager를 사용하는 것이지만, 플랫폼 JobScheduler API를 사용하는 것이 적절한 경우도 있습니다.

WorkManager는 필요에 따라 간단하거나 복잡한 작업을 설정할 수 있는 강력한 라이브러리입니다. WorkManager를 사용하여 특정 시간에 실행되도록 태스크를 예약하거나 태스크가 실행되어야 하는 조건을 지정할 수 있습니다. 태스크 체이닝을 설정하여 각 태스크가 차례로 실행되고 결과를 다음 태스크에 전달할 수도 있습니다. 사용 가능한 모든 옵션을 알아보려면 WorkManager 기능 목록을 참고하세요.

백그라운드 작업의 가장 일반적인 시나리오는 다음과 같습니다.

  • 서버에서 주기적으로 데이터 가져오기
  • 센서 데이터 가져오기 (예: 걸음수 측정기 데이터)
  • 주기적인 위치 데이터 가져오기 (Android 10 이상에서 ACCESS_BACKGROUND_LOCATION 권한이 부여되어야 함)
  • 카메라로 만든 사진과 같은 콘텐츠 트리거를 기반으로 콘텐츠 업로드

포그라운드 서비스

포그라운드 서비스는 중단되어서는 안 되는 작업을 즉시 실행하는 강력한 방법을 제공합니다. 그러나 포그라운드 서비스는 기기에 큰 부하를 줄 수 있으며 개인 정보 보호 및 보안과 관련된 문제가 발생할 수도 있습니다. 이러한 이유로 시스템은 앱이 포그라운드 서비스를 사용할 수 있는 방법과 시점에 많은 제한을 적용합니다. 예를 들어 포그라운드 서비스는 사용자에게 눈에 띄어야 하며 대부분의 경우 앱이 백그라운드에 있을 때 앱은 포그라운드 서비스를 실행할 수 없습니다. 자세한 내용은 포그라운드 서비스 문서를 참고하세요.

포그라운드 서비스를 만드는 방법에는 두 가지가 있습니다. 자체 Service를 선언하고 Service.startForeground()를 호출하여 서비스가 포그라운드 서비스임을 지정할 수 있습니다. 또는 장기 실행 작업자 지원에 설명된 대로 WorkManager를 사용하여 포그라운드 서비스를 만들 수 있습니다. 그러나 WorkManager로 만든 포그라운드 서비스는 다른 포그라운드 서비스와 동일한 제한사항을 모두 준수해야 합니다. WorkManager는 포그라운드 서비스를 더 간단하게 만들기 위한 편의 API를 제공하기만 합니다.

개발자 제공 결제 API

시스템은 더 구체적인 사용 사례에 더 효과적으로 작동하도록 설계된 대체 API를 제공합니다. 사용 사례에 적합한 대체 API가 있는 경우 포그라운드 서비스 대신 해당 API를 사용하는 것이 좋습니다. 앱의 성능이 개선될 수 있기 때문입니다. 포그라운드 서비스 유형 문서에서는 특정 포그라운드 서비스 유형 대신 사용할 수 있는 적절한 대체 API가 있는 경우를 설명합니다.

대체 API를 사용하는 가장 일반적인 시나리오는 다음과 같습니다.

  • 데이터 동기화 포그라운드 서비스를 만드는 대신 사용자 시작 데이터 전송을 사용하여 대규모 다운로드 또는 업로드 수행
  • 연결된 기기 포그라운드 서비스를 사용하는 대신 블루투스 페어링 및 데이터 전송에 호환 기기 관리자를 사용합니다.
  • 미디어 재생 포그라운드 서비스를 만드는 대신 PIP 모드를 사용하여 동영상 재생

사용자가 시작한 작업

적절한 API를 선택하는 방법을 보여주는 플로우 차트 이 차트는 '사용자가 시작한 작업' 섹션의 자료를 요약합니다.
그림 1: 사용자 시작 백그라운드 작업을 실행하는 데 적합한 API를 선택하는 방법

앱에서 백그라운드 작업을 실행해야 하며 앱이 표시되는 동안 사용자가 작업을 시작하는 경우 다음 질문에 답하여 적절한 접근 방식을 찾으세요.

앱이 백그라운드에 있는 동안 작업을 계속 실행해야 하나요?

앱이 백그라운드에 있는 동안 작업을 계속 실행할 필요가 없는 경우 비동기 작업을 사용해야 합니다. 비동기 작업을 실행하는 방법에는 여러 가지가 있습니다. 중요한 점은 앱이 백그라운드로 전환되면 이러한 옵션이 모두 작동을 중지한다는 것입니다. 앱이 종료되면 중지됩니다. 예를 들어 소셜 미디어 앱은 콘텐츠 피드를 새로고침하려고 할 수 있지만 사용자가 화면을 벗어난 경우에는 작업을 완료할 필요가 없습니다.

작업이 지연되거나 중단되면 사용자 환경이 나빠지나요?

작업이 연기되거나 취소되면 사용자 환경에 악영향을 미치는지 고려해야 합니다. 예를 들어 앱에서 애셋을 업데이트해야 하는 경우 작업이 즉시 실행되는지 아니면 기기가 충전되는 한밤중에 실행되는지 사용자가 알지 못할 수 있습니다. 이 경우 백그라운드 작업 옵션을 사용해야 합니다.

짧고 중요한 작업인가요?

작업을 지연할 수 없고 빠르게 완료되는 경우 shortService 유형의 포그라운드 서비스를 사용할 수 있습니다. 이러한 서비스는 다른 포그라운드 서비스보다 쉽게 만들 수 있으며 권한이 많이 필요하지 않습니다. 단, 짧은 서비스는 3분 이내에 완료되어야 합니다.

이 목적으로 사용할 수 있는 대체 API가 있나요?

작업이 사용자에게 표시되는 경우 포그라운드 서비스를 사용하는 것이 올바른 해결 방법일 수 있습니다. 이러한 서비스는 일단 시작되면 계속 실행되므로 작업을 중단하면 사용자 환경이 저하될 수 있는 경우에 적합합니다. 예를 들어 운동 추적 앱은 위치 센서를 사용하여 사용자가 지도에 조깅 경로를 기록할 수 있도록 할 수 있습니다. 백그라운드 작업 옵션을 사용하면 안 됩니다. 작업이 일시중지되면 추적이 즉시 중지되기 때문입니다. 이러한 상황에서는 포그라운드 서비스가 가장 적합합니다.

그러나 포그라운드 서비스는 많은 기기 리소스를 사용할 수 있으므로 시스템은 포그라운드 서비스의 사용 시기와 방법에 많은 제한을 적용합니다. 대부분의 경우 포그라운드 서비스를 사용하는 대신 더 적은 문제로 작업을 처리하는 대체 API를 사용할 수 있습니다. 예를 들어 사용자가 특정 위치에 도착할 때 앱에서 작업을 실행해야 하는 경우 포그라운드 서비스로 사용자의 위치를 추적하는 대신 geofence API를 사용하는 것이 가장 좋습니다.

이벤트에 대한 태스크

적절한 API를 선택하는 방법을 보여주는 플로우 차트 이 차트는 '이벤트에 대한 태스크' 섹션의 자료를 요약합니다.
그림 2: 이벤트 트리거 백그라운드 작업을 실행하는 데 적합한 API를 선택하는 방법

앱이 트리거에 대한 응답으로 백그라운드 작업을 실행해야 하는 경우도 있습니다. 예를 들면 다음과 같습니다.

외부 트리거 (예: FCM 메시지)일 수도 있고 앱 자체에서 설정한 알람에 대한 응답일 수도 있습니다. 예를 들어 게임은 일부 애셋을 업데이트하라는 FCM 메시지를 수신할 수 있습니다.

작업이 몇 초 이내에 완료될 것으로 확신할 수 있는 경우 비동기 작업을 사용하여 작업을 실행합니다. 앱이 백그라운드에 있더라도 시스템은 앱이 이러한 작업을 실행할 수 있도록 몇 초 동안 허용합니다.

태스크가 몇 초 이상 걸리는 경우 포그라운드 서비스를 시작하여 태스크를 처리하는 것이 적절할 수 있습니다. 실제로 앱이 현재 백그라운드에 있더라도 작업이 사용자에 의해 트리거되었고 승인된 백그라운드 시작 제한 예외 중 하나에 해당하는 경우 포그라운드 서비스를 시작할 수 있습니다. 예를 들어 앱이 우선순위가 높은 FCM 메시지를 수신하면 앱이 백그라운드에 있더라도 포그라운드 서비스를 시작할 수 있습니다.

태스크가 몇 초 이상 걸리는 경우 작업 예약 API를 사용하세요.