https://developer.android.com/topic/libraries/architecture/workmanager?hl=ko
WorkManager
는 지속적인 작업에 권장되는 솔루션이다. 앱이 다시 시작되거나 시스템이 재부팅될 때 작업이 예약된 채로 남아있으면 그 작업은 유지된다.
WorkManager는 앱 프로세스가 사라지더라도 안전하게 종료될 수 있는 진행 중인 백그라운드 작업을 위한 것이 아닙니다. 즉각적인 실행이 필요한 모든 작업을 위한 일반적인 솔루션도 아닙니다
사용자가 현재 보고있는 UI를 빠르게 변경해야 하는 작업은 WorkManager가 아닌 코루틴
을 사용해야 한다! 코루틴은 지속적인 작업이 아닌곳에 사용한다.
작업 제약 조건
작업 제약 조건을 사용하여 작업을 실행하는데 최적인 조건을 선언적으로 정의한다. 최적의 조건이 충족될 때 까지 작업이 지연되도록 한다. 예를 들어 기기가 무제한 네트워크에 있을 때 또는 배터리가 충분할 때만 실행한다.
다음 코드는 기기가 충전중이고 Wi-Fi에 연결되어 있을 때만 실행되는 작업 요청을 빌드한다.
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresCharging(true)
.build()
val myWorkRequest: WorkRequest =
OneTimeWorkRequestBuilder<MyWork>()
.setConstraints(constraints)
.build()
작업 실행 중에 제약 조건이 충족되지 않는 경우 WorkManager
에서 작업자를 중지한다. 그런 다음 모든 제약 조건이 충족될 때 작업을 다시 시도한다.
강력한 예약 관리
한 번 또는 반복적으로 실행할 작업을 예약할 수 있다. 작업에 태그 및 이름을 지정하여 고유 작업 및 대체 가능한 작업을 예약하고 작업 그룹을 함께 모니터링하거나 취소할 수 있다.
예약된 작업은 내부적으로 관리되는 SQLite 데이터베이스에 저장되며 WorkManager에서 기기를 재부팅해도 작업이 유지되고 다시 예약되도록 보장한다.
또한 WorkManager는 절전 기능을 사용하고 권장사항(ex. 잠자기 모드)을 준수하므로 배터리 소모를 걱정하지 않아도된다.
신속 처리 작업
WorkManager를 사용하여 백그라운드에서 즉시 실행할 작업을 예약할 수 있다. 사용자에게 중요하고 몇 분 내에 완료되는 작업에는 setExpedited()
를 호출하여 사용 가능하다.
val request = OneTimeWorkRequestBuilder()
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
.build()
WorkManager.getInstance(context)
.enqueue(request)
유연한 재시도 정책
경우에 따라 작업이 실패하기도 하는데 WorkManager
는 구성가능한 지수 백오프 정책을 비롯해 유연한 재시도 정책을 제공한다.
val myWorkRequest = OneTimeWorkRequestBuilder<MyWork>()
.setBackoffCriteria(
BackoffPolicy.LINEAR,
OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
TimeUnit.MILLISECONDS)
.build()
작업 체이닝
복잡한 관련 작업의 경우 직관적인 인터페이스를 사용하여 개별 작업을 함께 체이닝 하면 순차적으로 실행할 작업과 동시에 실행할 작업을 제어할 수 있다.
val continuation = WorkManager.getInstance(context)
.beginUniqueWork(
Constants.IMAGE_MANIPULATION_WORK_NAME,
ExistingWorkPolicy.REPLACE,
OneTimeWorkRequest.from(CleanupWorker::class.java)
).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java))
.then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java))
.then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java))
.then(
if (save) {
workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT)
} else /* upload */ {
workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT)
}
)
내장 스레딩 상호 운용성
코루틴 및 RxJava와 원활하게 통합되며 자체 비동기 API를 연결 할 수 있는 유연성 제공
WorkManager를 통해 예약된 작업 내에서 코루틴 사용 가능
WorkManager
는 사용자가 화면을 벗어나 이동하거나, 앱이 종료되거나, 기기가 다시 시작되더라도 안정적으로 실행되어야 하는 작업을 대상으로 설계되었다.