앱에서는 한 번에 여러 작업을 처리해야 하는 경우가 많습니다. Android API는 이를 실행할 수 있는 다양한 방법을 제공합니다. 올바른 옵션을 선택하는 것은 매우 중요합니다. 특정 옵션이 어떤 상황에 적합할 수도 있고 다른 경우에는 매우 적절하지 않을 수도 있기 때문입니다. 잘못된 API를 선택하면 앱의 성능이나 리소스 효율성이 저하되어 배터리가 소모되고 사용자 기기 전체의 성능이 저하될 수 있습니다. 경우에 따라 잘못된 접근 방식을 선택하면 Play 스토어에 앱이 등록되지 않을 수 있습니다.
이 문서에서는 사용 가능한 다양한 옵션을 설명하고 상황에 맞는 옵션을 선택하는 데 도움이 됩니다.
용어
백그라운드 작업과 관련된 일부 중요한 용어는 모순되는 여러 가지 방식으로 사용될 수 있습니다. 따라서 용어를 정의하는 것이 중요합니다.
앱이 백그라운드에서 실행 중이면 시스템은 앱에 여러 가지 제한을 적용합니다. (예를 들어 대부분의 경우 백그라운드의 앱은 포그라운드 서비스를 실행할 수 없습니다.)
이 문서의 목적상 '작업'이라는 용어는 앱이 기본 워크플로 외부에서 실행하는 작업을 의미합니다. 이해의 일관성을 보장하기 위해 이를 비동기 작업, 작업 예약 API, 포그라운드 서비스라는 세 가지 주요 작업 유형의 카테고리로 분류했습니다.
적절한 옵션 선택하기
대부분의 시나리오에서 작업이 속하는 카테고리 (비동기 작업, 작업 예약 API 또는 포그라운드 서비스)를 파악하면 작업에 사용할 올바른 API를 파악할 수 있습니다.
확실하지 않은 경우 결정에 뉘앙스를 더하는 Google의 플로우 차트를 사용할 수 있습니다. 각 옵션은 이 문서의 뒷부분에서 자세히 설명합니다.
백그라운드 작업에 고려할 두 가지 주요 시나리오는 다음과 같습니다.
이 두 시나리오에는 자체 결정 트리가 있습니다.
비동기 작업
대부분의 경우 앱은 포그라운드에서 실행되는 동안 동시 작업만 실행하면 됩니다. 예를 들어 앱에서 시간이 오래 걸리는 계산을 해야 할 수 있습니다. UI 스레드에서 계산한다면 사용자는 계산이 완료될 때까지 앱과 상호작용할 수 없습니다. 그러면 ANR 오류가 발생할 수 있습니다. 이러한 경우 앱은 비동기 작업 옵션을 사용해야 합니다.
일반적인 비동기 작업 옵션에는 Kotlin 코루틴과 자바 스레드가 포함됩니다. 자세한 내용은 비동기 작업 문서를 참고하세요. 백그라운드 작업 API와 달리 비동기 작업은 앱이 유효한 수명 주기 단계에서 중단되는 경우 (예: 앱이 포그라운드를 나간 경우) 완료되지 않을 수 있습니다.
Task Scheduling API
작업 예약 API는 사용자가 앱을 종료해도 계속해야 하는 작업을 실행해야 할 때 더 유연한 옵션입니다. 대부분의 경우 백그라운드 작업을 실행하는 가장 좋은 옵션은 WorkManager를 사용하는 것이지만, 경우에 따라 플랫폼 JobScheduler
API를 사용하는 것이 적합할 수도 있습니다.
WorkManager는 필요에 따라 간단하거나 복잡한 작업을 설정할 수 있는 강력한 라이브러리입니다. WorkManager를 사용하여 특정 시간에 실행되도록 작업을 예약하거나 작업을 실행해야 하는 조건을 지정할 수 있습니다. 작업 체인을 설정하여 각 작업이 차례로 실행되고 결과를 다음 작업으로 전달하도록 할 수도 있습니다. 사용 가능한 모든 옵션을 알아보려면 WorkManager 기능 목록을 참고하세요.
백그라운드 작업의 가장 일반적인 시나리오는 다음과 같습니다.
- 주기적으로 서버에서 데이터 가져오기
- 센서 데이터 가져오기 (예: 걸음수 측정기 데이터)
- 주기적인 위치 데이터 가져오기 (Android 10 이상에서는
ACCESS_BACKGROUND_LOCATION
권한을 부여받아야 함) - 카메라에서 생성된 사진과 같은 콘텐츠 트리거를 기반으로 콘텐츠 업로드
포그라운드 서비스
포그라운드 서비스는 중단되어서는 안 되는 작업을 즉시 실행할 수 있는 강력한 방법을 제공합니다. 그러나 포그라운드 서비스는 기기에 과부하를 일으킬 수 있으며 개인 정보 보호 및 보안에 영향을 미치는 경우도 있습니다. 따라서 시스템은 앱이 포그라운드 서비스를 사용할 수 있는 방법과 시점에 관해 많은 제한을 둡니다. 예를 들어 포그라운드 서비스는 사용자에게 눈에 띄어야 하며 대부분의 경우 앱은 백그라운드에 있을 때 포그라운드 서비스를 실행할 수 없습니다. 자세한 내용은 포그라운드 서비스 문서를 참고하세요.
포그라운드 서비스를 만드는 방법에는 두 가지가 있습니다. Service.startForeground()
를 호출하여 자체 Service
를 선언하고 서비스가 포그라운드 서비스임을 지정할 수 있습니다. 또는 장기 실행 worker 지원에 설명된 대로 WorkManager를 사용하여 포그라운드 서비스를 만들 수 있습니다.
그러나 WorkManager에서 만든 포그라운드 서비스는 다른 포그라운드 서비스와 동일한 제한사항을 모두 준수해야 합니다.
WorkManager는 포그라운드 서비스를 더 간단하게 만들 수 있는 몇 가지 편의 API를 제공합니다.
대체 API
시스템은 좀 더 구체적인 사용 사례에서 더 잘 작동하도록 설계된 대체 API를 제공합니다. 사용 사례에 적합한 대체 API가 있는 경우 포그라운드 서비스 대신 이 API를 사용하는 것이 좋습니다. 이렇게 하면 앱 성능을 개선하는 데 도움이 됩니다. 포그라운드 서비스 유형 문서에서는 특정 포그라운드 서비스 유형 대신 사용할 수 있는 적절한 대체 API가 있는 경우를 언급합니다.
대체 API를 사용하는 가장 일반적인 시나리오는 다음과 같습니다.
- 데이터 동기화 포그라운드 서비스를 만드는 대신 사용자 시작 데이터 전송을 사용하여 대량 다운로드 또는 업로드 수행
- 연결된 기기 포그라운드 서비스를 사용하는 대신 블루투스 페어링 및 데이터 전송에 호환 기기 관리자 사용
- 미디어 재생 포그라운드 서비스를 만드는 대신 PIP 모드를 사용하여 동영상 재생
사용자가 시작한 작업
앱이 백그라운드 작업을 실행해야 하고 앱이 표시되는 동안 사용자가 작업을 시작하는 경우 다음 질문에 답하여 올바른 접근 방식을 찾으세요.
앱이 백그라운드에 있는 동안 작업을 계속 실행해야 하나요?
앱이 백그라운드에 있는 동안 작업을 계속 실행할 필요가 없다면 비동기 작업을 사용해야 합니다. 비동기식 작업에는 여러 가지 옵션이 있습니다. 중요한 점은 앱이 백그라운드로 전환되면 이러한 옵션이 모두 작동을 중지한다는 것입니다. (앱이 종료된 경우에도 중지됩니다.) 예를 들어 소셜 미디어 앱에서 콘텐츠 피드를 새로고침하려고 하지만 사용자가 화면을 벗어나면 작업을 완료하지 않아도 됩니다.
작업이 지연되거나 중단되면 사용자 경험이 저하되나요?
작업이 연기되거나 취소될 경우 사용자 환경에 악영향을 미칠지 고려해야 합니다. 예를 들어 앱에서 애셋을 업데이트해야 하는 경우 작업이 즉시 발생하는지 아니면 기기가 충전되는 한밤중에 발생하는지 사용자가 알아채지 못할 수 있습니다. 이러한 경우 백그라운드 작업 옵션을 사용해야 합니다.
짧고 중요한 작업인가요?
작업을 지연할 수 없고 빠르게 완료될 경우 shortService
유형의 포그라운드 서비스를 사용할 수 있습니다. 이러한 서비스는 다른 포그라운드 서비스보다 만들기 쉬우며 많은 권한이 필요하지 않습니다. 단, 짧은 서비스는 3분 이내에 완료해야 합니다.
이 용도로만 사용할 대체 API가 있나요?
작업이 사용자에게 보이지 않는 경우 올바른 해결 방법은 포그라운드 서비스를 사용하는 것입니다. 이러한 서비스는 한 번 시작되면 지속적으로 실행되므로 작업을 중단하면 사용자 환경이 저하될 때 유용합니다. 예를 들어 운동 추적 앱은 위치 센서를 사용하여 사용자가 지도에 조깅 경로를 기록하도록 허용할 수 있습니다. 백그라운드 작업 옵션을 사용해서는 안 됩니다. 작업이 일시중지되면 추적이 즉시 중지되기 때문입니다. 이러한 상황에서는 포그라운드 서비스가 가장 적합합니다.
그러나 포그라운드 서비스는 잠재적으로 많은 기기 리소스를 사용할 수 있으므로 시스템은 사용할 수 있는 시기와 방법에 많은 제한을 둡니다. 대부분의 경우 포그라운드 서비스를 사용하는 대신 덜 문제없이 작업을 처리하는 대체 API를 사용할 수 있습니다. 예를 들어 사용자가 특정 위치에 도착했을 때 앱에서 작업을 실행해야 하는 경우 최선의 옵션은 포그라운드 서비스로 사용자의 위치를 추적하는 대신 지오펜싱 API를 사용하는 것입니다.
이벤트에 대한 응답의 작업
앱이 트리거에 대한 응답으로 백그라운드 작업을 실행해야 할 때가 있습니다. 예를 들면 다음과 같습니다.
- 방송 메시지
- Firebase 클라우드 메시징 (FCM) 메시지
- 앱에서 설정한 알람
외부 트리거 (예: FCM 메시지)일 수도 있고, 앱 자체에서 설정한 알람에 대한 응답일 수도 있습니다. 예를 들어 게임은 일부 애셋을 업데이트하라는 FCM 메시지를 수신할 수 있습니다.
작업이 몇 초 안에 완료될 것이 확실한 경우 비동기 작업을 사용하여 작업을 실행하세요. 시스템은 앱이 백그라운드에 있었더라도 몇 초 동안 이러한 작업을 실행할 수 있도록 허용합니다.
작업이 몇 초 이상 걸리는 경우 작업을 처리하기 위해 포그라운드 서비스를 시작하는 것이 적절할 수 있습니다. 실제로 앱이 현재 백그라운드에 있더라도 작업이 사용자에 의해 트리거되고 백그라운드 시작 제한에서 승인된 예외 중 하나에 해당하는 경우 포그라운드 서비스를 시작하도록 허용될 수 있습니다. 예를 들어 앱이 높은 우선순위의 FCM 메시지를 수신하면 앱이 백그라운드에 있더라도 포그라운드 서비스를 시작할 수 있습니다.
작업이 몇 초 이상 걸리는 경우 작업 예약 API를 사용하세요.