오늘도 더 나은 코드를 작성하였습니까?

Android Background(백그라운드 작업 해결방법) 본문

Android Jetpack Architecture/Workmanager

Android Background(백그라운드 작업 해결방법)

hik14 2021. 3. 10. 19:15

Background에 있다는 것

백그라운드 작업을 이해 하기전에 앱이 forground에 있다는 사실을 명확하게 이해할 필요가 있다.

앱이 아래 상황중 단 1개라도 해당이 된다면 앱은 forground에 있다.

 

- 화면에 Activity가 보인다면 started, paused 상태와 관계 없이 앱은 forground에 있다.

- 앱이 forground service를  실행하고 있다

- 앱이 다른 forground 앱이랑 연결될 때 service 중 하나에 바인딩하거나 해당 contentsProvider 중 하나를 사용하여 앱에 연결됩니다.

 

예를 들어 다른 앱이나 시스템이 아래 항목에 연결되면 앱이 forground에 있는 것

  • - 입력(소프트 키보드가 앱에 떠 있는 경우)
  • - wallpaper(움직이는 배경화면을 실행 시키는 service)
  • - NotificationListenerService(notification을 핸들링 하는 service)
  • - Voice or text service
  • - music service

위 어떤것에도 해당되지 않으면 앱은 background에 있다고 보면된다.

Background 작업에 맞는 도구 찾기

백그라운드에서 작업을 실행하면 RAM 및 배터리와 같은 기기의 제한된 리소스가 소모됩니다.

백그라운드 작업은 장치의 배터리 수명을 저하 시키거나 사용자가 비디오 시청, 게임 플레이, 카메라 사용과 같은 시간에 장치 성능 저하를 경험할 수 있다.

 

배터리 수명을 개선하고 더 나은 사용자 경험을 제공하기 위해 Android는 백그라운드 실행에 대한 제한을 설정하기 위해 여러 릴리스에 걸쳐 발전했습니다. 아래와 같은 제한이 존재한다.

 

- 잠자기 및 앱 대기 : 화면이 꺼져 있고 기기가 유휴 상태이고 충전 중이 아닐 때 앱 동작을 제한합니다.

- 백그라운드 위치 제한:  백그라운드 앱이 사용자의 현재 위치를 검색 할 수있는 빈도를 제한합니다.

- 백그라운드 서비스 제한 : 백그라운드 서비스가 실행되고 숨겨 지거나 보이지 않는 방식으로 CPU / 네트워크를 사용하지 못하도록 제한

- App Standby Buckets 가장 최근에는 사용자가 사용하지 않는 앱이 쓸수있는 리소스를 제한 

- App Restrictions 시스템이 백그라운드에서 시스템 리소스에 대한 앱의 액세스를 제한하라는 메시지를 표시

-  Battery Saver improvements

 

개발을 하다보면 여러 상황해서 백그라운드에서 처리해야될 작업이 생긴다 이 경우, 서로 다른 상황에 때라 처리가 필요하다.

백그라운드 실행을 구현하는 데 사용할 도구를 결정하려면 개발자가 수행하려는 작업과 제한 사항을 명확하게 이해해야합니다.

아래 순서도는 결정을 내리는 데 도움이 될 수 있습니다.

 

 

 

WorkManager

모든 OS 백그라운드 실행 제한을 고려하여 백그라운드 실행에 권장되는 솔루션입니다. 지연된 경우에도 작업이 실행되도록 보장해야하는 경우 WorkManager를 사용해야합니다. 이 API를 사용하면 작업 (일회성 또는 반복)을 예약하고 작업을 연결 및 결합 할 수 있습니다. 장치가 유휴 상태이거나 충전 중일 때 트리거하거나 콘텐츠 제공자가 변경 될 때 실행하는 것과 같은 실행 제약 조건을 적용 할 수도 있습니다.

 

예) 로그를 서버에 업로드하기 위해 압축해야하는 경우입니다. 이를 위해 두 개의 작업 요청을 생성할 수 있습니다.

첫째 : 파일을 압축합니다. 이 단계에서 장치를 충전해야한다는 제약 조건을 추가 할 수 있습니다.

둘째 : 서버에 업로드합니다. 이 요청의 경우 유효한 연결이있을 때만 작업이 트리거되도록 네트워크 연결 제약 조건을 추가해야합니다.

 

두 작업을 대기열에 추가 한 후 WorkManager는 앱이 필요한 리소스에 액세스 할 수있을 때 작업을 실행합니다.(작업 체이닝)

 

WorkManager의 또 다른 좋은 기능은 전원 관리 기능을 반영한다는 것입니다. 

따라서 작업이 정의 된 시간에 실행되도록 예약되어 있고 해당 시간에 장치가 잠자기 상태에있는 경우

WorkManager는maintenance window 동안 작업을 실행하려고합니다. 제약 조건이 충족되거나 잠자기가 해제 된 후.

 

*Doze mode / maintainance window

iamrealizer.tistory.com/37

 

안드로이드 DOZE 모드 관련 처리 공부내용 (6.0, 7.0기준)

'포트폴리오' 용으로 만든 알람앱이 하나 있다. 알람이 울리는 시간이 되면, 잠금화면 위에  알람이 울리는 구조다. 처음에는 테스트를 위해, 2분 내지 3분 뒤 시간으로 맞춰서, 알람을 테스트했

iamrealizer.tistory.com

 

새로운 온라인 콘텐츠(서버) 동기화와 같은 외부 이벤트에 대한 응답으로 장기 실행 작업을 예약하려면 Firebase 클라우드 메시징을 사용하여 앱에 알리고 WorkManager로 작업 요청을 만들어 콘텐츠를 동기화한다. 즉, 푸쉬알림을 통해 사용자에게 알리고 한다. 

 

사용자가 앱을 떠나거나 화면을 꺼도 지연없이 사용자가 시작한 작업을 완료해야하는 경우 (예 : 음악 / 비디오 재생 또는 탐색의 경우) Foreground Service를 사용해야합니다.

 

작업을 트리거하고 사용자 상호 작용을 포함하며 연기 할 수없는 정확한 시간에 작업을 실행해야하는 경우 AlarmManager(특히 setExactAndAllowWhileIdle 메서드)를 사용합니다. 

  • 환자의 약을 먹을 시간 알림
  • TV방송의 시작시간

Alarm이 트리거되면 작업을 완료하는 데 몇 초 밖에 주어진 시간이 없다면,앱이 네트워크에 액세스하지 못할 수 있습니다 (예 : 잠자기 중 또는 앱 대기 버킷으로 인해).

 

네트워크가 정말로 필요하고 긴 작업을 수행하려면 WorkManager를 사용하자

 

wakeup 알람이 트리거 될 때마다 장치는 저전력 모드에서 나오고 시간이 지남에 따라 배터리 수명에 큰 영향을 미칠 수있는 부분적인 wake lock()을 유지합니다. 이는 Google Play Console을 통해 제공되는 Android Vitals에 강조 표시된 과도한 웨이크 업 통계를 통해 모니터링 할 수 있습니다

 

'Android Jetpack Architecture > Workmanager' 카테고리의 다른 글

Worker 중간 진행률 및 관찰  (0) 2021.03.12
작업 상태 확인후 관리하고 취소까지  (0) 2021.03.12
WorkRequest 만들기.  (0) 2021.03.12
Workmanager codelab  (0) 2021.03.12
Workmanager 기본 사용법  (0) 2021.03.11