https://android-developers.googleblog.com/2018/10/modern-background-execution-in-android.html
안드로이드 공식 블로그 내용을 번역한 글 입니다. 의역 및 오역 다수 있을 수 있습니다.
안드로이드 백그라운드 실행 정책
애플리케이션은 언제 백그라운드 상태로 있을까?
백그라운드 실행을 이해하기 전에 애플리케이션이 포어그라운드인지 백그라운드인지 명확하게 파악해야합니다. 다음 중 하나라도 해당되면 애플리케이션이 포어그라운드에있는 것으로 간주됩니다.
- 어떤 애플리케이션이 액티비티가 시작(started),중지(pause)와 상관없이 가시적일 때
- 어떤 애플리케이션이 포어그라운드 서비스를 가질 때
- 포어그라운드 애플리케이션이 서비스를 갖는 애플리케이션에 바인딩하거나 콘텐츠프로바이더를 사용하여 앱에 연결결할 때.
예를 들어 다른 앱이나 시스템이 아래의 내용에 바인딩 하면 애플리케이션이 포어그라운드에 있는 것입니다.- IME
- Wallpaper service
- Notification listener
- Voice 또는 text 서비스
- 자동차에서 스트리밍을 드는 음악 앱(Android Auto 일때)
만약 위 조건들을 만족하지 못한다면 애플리케이션이 백그라운드에 있는것으로 간주됩니다.
백그라운드 실행 변화
백그라운드에서 실행중인 작업들은 디바이스의 RAM이나 베터리같은 자원들을 소모하고, 사용자들에게 좋지 못한 경험을 제공합니다. 예를 들어 백그라운드 작업으로 인해 장치의 배터리 수명이 저하되거나 비디오 시청, 게임, 카메라 사용과 같은 사용자의 장치 성능 저하가 발생할 수 있습니다.
베터리 수명을 개선하고 좋은 사용자 경험을 제공하기 위해서 안드로이드는 몇가지 백그라운드 정책들을 진화 시켜왔습니다.
- 도즈모드와 앱 대기상태(Doze And App Standby) : 화면이 꺼지고, 충전중이 아니며 대기상태일때 애플리케이션의 행동을 제한 합니다.
- 백그라운드 상태에서 위치 서비스 제약 : 백그라운드 상태에 있는 앱이 사용자의 현재위치를 검색할 수 있는 빈도를 제한 합니다.
- 백그라운드 서비스 제약 : 보이지 않는 CPU/Network 사용과 실행중인 백그라운드 서비스들을 제한합니다.
- 가장 최근에는 사용자가 사용하지 않는 앱에서 사용할 수 있는 기기 리소스를 제한 할 수 있는 앱 대기 버킷(App Standby Buckets)과 앱이 좋지 않는 행동을 보이는 경우 백그라운드에서 시스템 리소스에 대한 액의 액세스를 제한하도록 사용자에게 경고하는 앱 제한(App Restrictions) 과 배터리 절약 개선(Battery Saver improvements) 정책이 추가 되었습니다.
사례와 해결방법
백그라운드 실행을 구현하는 데 사용할 도구를 결정하려면 개발자가 원하는 것을 명확하게 이해하고 어떤 제한 사항을 가지고 있어야합니다. 이 순서도는 결정을 내리는 데 도움이됩니다.
WorkManager
WorkManager는 모든 OS 백그라운드 실행 제한을 고려하여 백그라운드 실행에 권장되는 솔루션입니다. 작업이 연기 되어도 작업이 실행되도록 보장해야하는 경우 WorkManager를 사용할 수 있습니다. 이 API를 사용하면 작업(일회성 또는 반복일때)을 예약하거나 작업을 결합(체이닝) 할 수 있습니다. 또한 장치가 유휴상태이거나 충전중일 때 특정이벤트를 트리거하거나 콘텐츠 프로바이더가 변경 될 때 실행하는 것과 같은 실행 제한 조건을 적용할 수 있습니다.
한가지 예로 로그를 압축하여 서버에 업로드해야하는 경우라면 두가지 작업 요청을 만들어 수행할 수 있습니다.
- 파일을 압축합니다. 이 단계에서 장치가 충전중이여야 한다는 제한 조건을 추가 할 수 있습니다.
- 서버에 업로드 합니다. 이 요청의 경우 네트워크가 사용가능할 때만 작업이 실행되도록 네트워크 연결 제한 조건을 추가해야합니다.
두 작업을 모두 큐에 넣은 뒤 WorkManager와 함께 필요한 리소스가 충족할 때 작업을 수행되도록 할 수 있습니다.
WorkManager의 또 다른 장점은 전원 관리 기능을 존중한다는 것입니다. WorkManager는 제약 조건이 충족되며, Doze가 해제 된다면 주어진 작업을 실행할 것입니다.
FCM
새로운 온라인 콘텐츠 동기화와 같은 외부 이벤트에 대한 응답으로 장기적인 실행 작업을 예약하려면 Firebase Cloud Messaging을 사용하여 앱에 알린 다음 WorkManager로 작업 요청을 만들어 콘텐츠를 동기화하면 됩니다.
Foreground Service
앱에서 음악 / 비디오 재생 또는 탐색과 같이 앱을 종료하거나 화면을 꺼도 지연되지 않고 사용자가 시작한 작업을 완료해야하는 경우 포어그라운드 서비스를 사용해야합니다.
AlarmManager
정확한 시간에 작업을 실행해야하고 사용자와 상호 작용이 포함되며 지연 될 수없는 경우 AlarmManager를 사용하면됩니다. 예를 들면,
- 약먹는 시간을 상기 시킬 때
- 좋아하는 TV프로그램이 시작하려 하는것을 알려줄 때
알람이 발생하면 작업을 짧은 시간(수초)내에 끝내야 하며, 네트워크에 액세스 하지 못할 수도 있습니다.(도즈모드나 앱대기 버킷 때문에) 네트워크가 필요하거나 긴 작업을 수행하려면 WorkManager를 사용해야합니다. 알람이 울릴 때마다 장치는 저전력 모드를 벗어나 부분적 wake-lock을 유지하므로 시간이 지남에 따라 배터리 수명에 상당한 영향을 줄 수 있습니다. Google Play Console을 통해 제공되는 Android Vitals에서 강조 표시된 과도한 꺠우기 통계를 통해 모니터링 할 수 있습니다.
요약하자면 이렇습니다.
사례 | 예시 | 해결방법 |
지연 가능한 작업의 실행을 보장받고 싶을 때 |
– 로그를 서버에 업로드 |
WorkManager |
외부의 이벤트에 대한 응답으로 어떠한 작업을 시작하고 싶을 때 | – 이메일처럼 새로운 콘텐츠를 동기화 | FCM+WorkManager |
사용자가 앱을 종료하더라도 사용중이던 앱을 즉시 수행할 때 |
– 음악 앱 |
Foreground Service |
정확한 시간에 알림과 같은 사용자 상호 작용과 관련된 작업을 트리거 할 때 |
– 알람 시계 |
AlarmManager |
백그라운드 실행을 신중하게 사용하면 배터리를 절약하면서 사용자를 즐겁게하는 멋진 앱을 만들 수 있습니다. Android에서 백그라운드 작업을 실행하는 데 대한 자세한 정보가 필요하면 Android 개발자 사이트에 멋진 콘텐츠가 있습니다.
2개의 댓글
김한철 · 2018년 10월 31일 10:13 오전
“만약 위 조건중 하나라도 충족을 못한다면 애플리케이션이 백그라운드에 있는것으로 간주됩니다.” 는 “만약 위 조건들을 모두 만족하지 못한다면 ~” 으로 수정하는 것이 더 좋을 것 같습니다.
Charles · 2018년 10월 31일 10:29 오전
수정했습니다 감사합니다 !