1
Jongchan Kim - Android Engineer, Coupang
ace.jckim@gmail.com
Speaker
Android 12를 위한
Background 처리 방법
2
02 Android 12 백그라운드 변경 정책
01 Foreground Service 가 무엇인지 알아보기
03 어떻게 대응해야 할까?
04 상황에 맞는 적절한 백그라운드 처리 방법
05 요약 & 마무리
3
포그라운드 서비스란?
4
어떤 경우에 써야 하나요?
멀티태스킹
유저 액션을 마무리 할 때
5
어떤 경우엔 쓰면 안될까요?
6
포그라운드 서비스가 백그라운드 작업에 적합한 선택지가 아닌 이유
7
유저가 하루에 받는�Foreground Service Notification의 갯수
2
to
500+
8
백그라운드에서 시작된 Foreground Service의 비율
46%
9
Foreground Service가 10초이내로 실행된 비율
70%
10
02 Android 12 백그라운드 변경 정책
01 Foreground가 무엇인지 알아보기
03 어떻게 대응해야 할까?
05 요약 & 마무리
04 상황에 맞는 적절한 백그라운드 처리 방법
11
Foreground Service가 실행되고 10초동안은 노티피케이션에 나타나지 않습니다.�-> 10초안에 끝나는 작업은 노티피케이션에 표현되지 않음.�� 이 기본 동작을 재정의 할 수 있음.�
무엇이 Android 12에서 바뀌었을까요?
12
무엇이 Android 12에서�바뀌었을까요?
이미지 출처 : https://medium.com/@jayd1992/foreground-services-in-android-e131a863a33d
13
낮은 레이턴시, 높은 안정성��Doze모드, 배터리 세이버 상태에서도 동작 가능�
긴급한 작업에 대해서도 대기처리를 시킬 수 있음��WorkManager API를 통해서 제공 됨.
새로운 처리 방식 : Expedited Jobs
14
백그라운드에서 포그라운드
서비스 시작이 허용되는 경우
앱이 Activity와 같이 유저에게�보여지고 있는 상태에서는 가능.
존재하는 태스크의 백 스택에 Activity가 있는 경우.
FCM을 사용하여 높은 우선순위의 메시지를 받으면 가능.
15
백그라운드에서 포그라운드 서비스 시작이 허용되는 경우
유저가 앱에서 UI와 관련있는 것을 작동시키는 경우.
ex) Bubble, Notificaiton, Widget, Activity
앱이 Geofencing 혹은
Activity Recognition Transition과 관련있는 이벤트를 받았을 때.
디바이스가 재부팅되고 아래와�같은 Intent Action을 브로드 캐스트 리시버로부터 받을 때.��ACTION_BOOT_COMPLETED�ACTION_LOCKED_BOOT_COMPLETED�ACTION_MY_PACKAGE_REPLACED
16
백그라운드에서 포그라운드 서비스 시작이 허용되는 경우
앱이 아래와 같은 Intent Action을 브로드 캐스트 리시버로부터 받을 때.��ACTION_TIMEZONE_CHANGED�ACTION_TIME_CHANGED�ACTION_LOCALE_CAHNGED
앱이 BLUETOOTH_CONNECT,�BLUETOOTH_SCAN 권한이�요구되는 블루투스 브로드캐스트를 받을 때
앱이 디바이스 오너 혹은 프로필 오너와 같은 강한 권한을 가진 경우��ex) MDM / Device Policy Client 앱
17
백그라운드에서 포그라운드 서비스 시작이 허용되는 경우
앱이 Companion Device Manager�를 사용하여 시스템이 Companion device가 가까워져서 앱을 깨울 때.
시스템이 “Sticky” 포그라운드 서비스를 재시작 할 때.��StartedService를 쓸 때�onStartCommand()의 반환으로 START_STICKY,�START_REDELIVER_INTENT를
처리할 때.
유저가 개발자의 앱에 대하여 배터리 최적화 옵션을 끈다면 가능.�개발자는 유저에게 해당 옵션을 조정 할 수 있는 세팅 페이지를 제공하는 것이 가능.
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS를 intent action으로�실행하면 된다.
18
02 Android 12 백그라운드 변경 정책
03 어떻게 대응해야 할까?
05 요약 & 마무리
04 상황에 맞는 적절한 백그라운드 처리 방법
01 Foreground가 무엇인지 알아보기
19
WorkManager 2.7.0-alpha01부터�setExpedited()를 사용하여 작업이 신속하게 처리되어야 한다는 옵션을 줄 수 있습니다.��이 기능을 사용하면 Android 12에서는 신속 처리 작업(Expedited Job)을 사용하고, 이전버전에서는 Android의 포그라운드 서비스를 사용합니다.
OutOfQuotaPolicy는 신속 처리 작업의 할당량이 초과되었을 때, 어떻게 처리할지를 결정합니다.
WorkManager
WorkRequest.Builder�setExpedited
@SuppressLint("UnsafeExperimentalUsageError")
private inline fun <reified T : ListenableWorker> workRequest(
inputData: Data = imageInputData,
tag: String? = null
) =
OneTimeWorkRequestBuilder<T>().apply {
setInputData(inputData)
setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
if (!tag.isNullOrEmpty()) {
addTag(tag)
}
}.build()
20
신속 처리 작업은 중요한 작업을 최상의 우선순위로 처리하는 포그라운드 서비스와 리소스를 효율적으로 컨트롤하여 작업을 진행하는 JobScheduler 작업의 용도 사이에 있는 선택지로 활용하는게 가능합니다.
신속 처리 작업�Expedited Job
시스템은 가능한 빠르게 신속 처리 작업을 처리�하려고하나, 다른 작업 유형들과 마찬가지로�시스템의 리소스가 부족하면 신속 처리 작업도�지연 될 수 있음.
특히 다음 조건 중 하나가 발생하면 지연이 이뤄집니다.�
신속 처리 작업은�지연 될 수 있습니다.
21
03 어떻게 대응해야 할까?
04 상황에 맞는 적절한 백그라운드 처리 방법
05 요약 & 마무리
02 Android 12 백그라운드 변경 정책
01 Foreground가 무엇인지 알아보기
22
백그라운드 처리 가이드�상황에 맞는 적절한 처리방법
출처 : developers.android.com
Coroutine / RxJava
AlarmManager
WorkManager
23
05 요약 & 마무리
03 어떻게 대응해야 할까?
02 Android 12 백그라운드 변경 정책
04 상황에 맞는 적절한 백그라운드 처리 방법
01 Foreground가 무엇인지 알아보기
24
기존에 동일한 목적으로 수행시키려던 작업들은 WorkManager의 setExpedited()를 이용하여 수행해야하며, 이는 디바이스의 리소스 관리를 위함이다.
몇가지 예외사항에 대해서는 가능하다.
하지만 대부분 유저에게 앱이 직접적으로 사용되고있는 와중에 가능한 케이스이다.
요약 & 마무리
유저가 앱과 인터렉션을 지속적으로�하는 동안에 처리해야하는지 아닌지.
�각 작업이 적시에 처리되어야 하는지,�연기가 되어도 괜찮은 작업인지.
특히 지연되어도 되는 작업이면
WorkManager의 사용을 고려해보자.
Foreground Service를 Android 12�타겟으로는 백그라운드에서 수행할 수 없다.
모든 백그라운드 작업은 목적과 실행 타이밍에 따라서 방법을 달리 해야한다.
25
Thank you!
https://developer.android.com/about/versions/12/foreground-services
https://developer.android.com/guide/background
https://github.com/android/architecture-components-samples/tree/android-s/WorkManagerSample
Resources
Jongchan Kim - Android Engineer, Coupang
ace.jckim@gmail.com