study record

[Background Tasks] Guide to background processing 백그라운드 처리 가이드 본문

안드로이드/android developers 정복하기

[Background Tasks] Guide to background processing 백그라운드 처리 가이드

asong 2021. 4. 25. 23:58

*안드로이드 개발자 공식 사이트 android developers docs를 번역, 정리하는 글입니다.

 

이번 글: developer.android.com/guide/background

 

백그라운드 처리 가이드

 백그라운드에서 데이터를 처리하는 것은 우리의 사용자들, 뿐만 아니라 안드로이드 플랫폼 위의 좋은 사람들을 위해 책임감 있게 해야 하는 안드로이드 개발의 중요한 부분이다. 이 가이드는 백그라운드 작업으로써 어떤 자격을 갖추어야 하는지를 설명하고 백그라운드 테스크 카테고리들을 정의하고, 우리들의 테스크들을 카테고리화하는 기준들을 우리에게 제공할 것이다. 그리고 마지막으로 테스크들을 시행하기 위해 사용해야하는 API들을 추천할 것이다.

 

원리 가이드

 일반적으로 몇 초보다 더 걸리는 테스크는 백그라운드 스레드에 강등되어야 한다. 흔히 오래 걸리는 테스크들은 예를 들어 비트맵을 해석하는 것, 저장공간 접근, 머신 러닝 모델 작업, 네트워크 요청 수행 같은 것들이다.

 

백그라운드 작업의 정의

 앱은 아래의 조건들이 만족되는 한 백그라운드에서 돌아가는 것이 고려된다.

 

1. 앱의 액티비티들이 유저에게 현재 보이지 않는다.

2. 하나의 액티비티가 유저에게 보이는 동안 시작된 포그라운드 서비스들이 작동되고 있지 않는다.

 

그렇지 않으면 그 앱은 포그라운드에서 돌아가는 것으로 고려된다.

 

*노트: 때때로 앱으로부터 액티비티가 유저에게 보이는 동안 포그라운드 서비스가 시작된 후, 유저가 홈버튼을 누른 것과 같이 앱으로부터 멀어진다. 이 상황에서 앱은 유저가 멀어진 후이지만서도 포그라운드에서 돌아가는 것으로 고려된다.

 

흔한 백그라운드 테스크들

아래의 리스트들은 백그라운드에서 돌아가는 동안 앱이 관리하는 흔한 테스크들이다.

  • 앱이 매니페스트 파일에서 브로드캐스트 리시버를 등록
  • 앱이 알람 매니저를 사용하는 반복 알람을 스케줄한다.
  • 앱이 백그라운드 테스크를 스케줄한다. work manager를 사용하는 worker나 job scheduler를 사용하는 job.

 

백그라운드 테스크들의 카테고리들

백그라운드 테스크들은 다음의 메인 카테고리들 중 하나이다.

  • 즉시 immediate
  • 연기된 deffered
  • 정확한 exact

테스크를 카테고리화하기 위해 다음의 질문들을 대답하고 그림 1의 결정 트리를 따라가라.

 

유저가 어플리케이션과 상호작용하는 동안 테스크가 완성될 필요가 있는가?

   그렇다면 이 테스크는 즉시(immediate) 실행으로 카테고리화되어야 한다. 그렇지 않다면 다음 질문으로 넘어가자.

 

테스크가 정확한 시간에 돌아갈 필요가 있는가?

   그렇다면 정확한(exact) 테스크로 카테고리화하여야 한다.

 

대부분의 테스크들은 정확한 시간에 실행될 필요가 없다. 테스크들은 일반적으로 네트워크 이용가능성과 남아있는 배터리같은 상태에 따른 작은 변수들에 맞춘다. 정확한 시간에 맞추어 실행될 필요가 없는 테스크들은 연기된(deffered)로 카테고리화되어야 한다.

 

그림 1

 

추천 해결책들

다음의 섹션들은 각 백그라운드 테스크 타입에 맞춘 추천 해결책들을 설명한다.

 

즉시의 테스크들(Immediate tasks)

우리는 유저가 특정 범위를 벗어나거나 상호작용을 끝낼 때, 테스크가 끝내야 한다면 Kotlin coroutines를 추천한다. 많은 안드로이드 KTX 라이브러리들은 ViewModel, 흔한 어플리케이션 생명주기들 같은 앱 컴포넌트들을 위한 ready to use coroutine 범위들을 포함한다.

 

자바 프로그래밍 언어 유저들을 위해서는 Threading on Android를 추천한다.

 

즉시 실행되어야 하거나 지속적 처리가 필요한 테스크들을 위해 우리는 WorkManager을 사용하는 것을 추천한다. 이것은 long-running 테스크들을 서포트한다.

 

미디어 플레이백이나 액티브한 네비게이션같은 특정 케이스들을 위해 우리는 직접 포그라운드 서비스들을 사용하기 원할지도 모른다.

 

연기된 테스크들(Deffered tasks)

유저 상호작용에 직접적으로 연결되지 않거나 미래에 아무때나 실행될 수 있는 모든 테스크든 연기될 수 있다. 연기 테스크들을 위한 추천 해결책은 WorkManager이다.

 

WorkManager는 앱이 종료하거나 디바이스가 재시작할 때조차도 실행되어야 하는 비동기 테스크들을 연기가능하게 쉽게 스케줄한다. 테스크 타입들을 스케줄하는 방법을 배우기 위해 WorkManager 자료를 보아라.

 

정확한 테스크들(Exact tasks)

정확한 시간에 실행되어야 하는 테스크는 AlarmManager를 사용할 수 있다.

AlarmManager를 더 배우기 위해서는 Schedule repeating alarms를 보아라.