https://developer.android.com/topic/libraries/architecture/workmanager?hl=ko
https://dongsik93.github.io/til/2020/05/15/til-jetpack-workmanager/
https://medium.com/@limgyumin/새로운-안드로이드-백그라운드-작업-처리법-workmanager-f625e07b384c
https://velog.io/@hyeryeong/Android-WorkManager-공부해보기
WorkManager
2018년 구글 I/O 에서 발표된 안드로이드 백그라운드 작업 WorkManager
WorkManager 는 Android Jetpack 의 아키텍처 구성요소
앱이 다시 시작되거나 시스템이 재부팅될 때 작업이 예약된 채로 남아 있다면 이 작업들은 persistent하게 유지됨.
백그라운드 작업은 persistent work을 통해 처리될 때 가장 적합하므로, WorkManager는 백그라운드 작업에서 권장되는 기본 API
WorkManager는 사용자가 화면을 벗어나 이동하거나, 앱이 종료되거나, 기기가 다시 시작되더라도 안정적으로 실행되어야 하는 작업을 대상으로 설계됨.
사용자가 앱을 사용하지 않을때도 수행해야 하는 작업들이 있는 경우는 매우 까다로움 -> 이러한 경우를 WorkManager를 통해 어느정도 해결 가능
앱의 프로세스 수명과 별도로 살아남기 위한 작업에 사용하는 것이 좋음
특징
Work constraints (작업 제약 조건)
Work constarints를 설정함으로써 최적으로 작업을 처리하는 조건을 셋팅해줄 수 있음.
For example, run only when the device is on an unmetered network(무제한 네트워크), when the device is idle(작업중이지 않은 상태), or when it has sufficient battery.
Robust scheduling (강력한 예약 관리)
Expedited work (신속 처리 작업)
WorkManager를 사용하여 백그라운드에서 즉시 실행할 작업을 schedule 가능.
사용자가 몇 분 내에 완료해야 되는 작업에는 Expedited work 사용
Flexible retry policy (유연한 재시도 정책)
Sometimes work fails. WorkManager offers flexible retry policies, including a configurable exponential backoff policy.
Work chaining (작업 체이닝)
복잡하게 관련되어있는 작업의 경우, 직관적인 인터페이스를 통해 개별 작업을 묶어 체이닝하면 순차적으로 실행할 작업과 동시에 실행할 작업을 제어 가능
작업A 의 결과에 따라 B or C 를 선택하여 처리하고 D 를 이어서 처리하는 등의 작업 연결 처리가 가능
Built-In threading interoperability (내장 스레딩 상호 운용성)
WorkManager는 코루틴 및 RxJava와 원활하게 통합되며 자체 비동기 API를 연결할 수 있는 유연성을 제공
API
WorkManage API
WorkManage :
처리해야 하는 작업을 자신의 큐에 넣고 관리
싱글톤 객체이기에 getInstance()를 통해 WorkManager 객체를 반환받아 사용
Worker :
추상 클래스
Worker 클래스를 상속받은 후 수행할 백그라운드 작업을 doWork()에 오버라이딩
doWork()의 결과에 따라, SUCCESS(해당 작업 마무리), FAILURE(실패 중단), RETRY(재시도) 3개 중 하나 리턴
WorkRequest :
WorkManager를 통해 실제 요청하게 될 개별 작업
1. OneTimeWorkRequest
WorkState :
WorkRequest의 id와, 해당 WorkRequest의 현재 상태를 담는 클래스
WorkState를 보고 예약된 작업의 현재 상태 파악 가능
implementation ("androidx.work:work-runtime-ktx:2.7.1")
중복 작업을 방지하려면 작업을 큐에 추가할 때 주의하시기 바랍니다. 예를 들어 앱에서 24시간마다 백엔드 서비스에 로그를 업로드하려고 시도할 수 있습니다. 한 번만 실행해야 하는 작업임에도 동일한 작업이 여러 번 큐에 추가될 수 있으므로 주의해야 합니다. 한 번만 큐에 추가하려면 작업을 고유 작업으로 예약하면 됩니다.