안드로이드의 백그라운드 작업을 처리하기 위해 만들어진 WorkManager를 알아보겠습니다.
실행이 보장되며 제약조건을 붙일 수 있습니다. 예를 들어 네트워크 연결 시에만 작업이 처리되도록 할 수 있습니다.
구글 플레이 서비스와 관계없이 동작하고 작업이 실행/대기 중인지, 성공/실패 했는지 등의 상태조회를 할 수 있습니다.
class UploadWorker(appContext : Context, workerParams : WorkerParameters) : Worker(appContext, workerParams){
override fun doWork() : Result{
// Do the work here--in this case, upload the images.
uploadImages()
//Indicate whether the work finished successfully with the Result
return Result.success()
}
}
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresCharging(true)
.build()
val uploadWorkRequest : WorkRequest =
OneTimeWorkRequestBuilder<UploadWorker>()
.setConstraints(constraints)
.build()
WorkManager
.getInstance(myContext)
.enqueue(uploadWorkRequest)
Work States 확인하기
// by id
workManager.getWorkInfoById(syncWorker.id) // ListenableFuture<WorkInfo>
// by name
workManager.getWorkInfosForUniqueWork("sync") // ListenableFuture<List<WorkInfo>>
// by tag
workManager.getWorkInfosByTag("syncTag") // ListenableFuture<List<WorkInfo>>
1회성 작업 상태
one-time 작업 요청의 경우 작업이 ENQUEUED 상태에서 시작됩니다.
ENQUEUED 상태에서 작업은 Constraints 및 초기 지연 타이밍 요구사항이 충족되는 즉시 실행될 수 있습니다. 여기에서 작업은 RUNNING 상태로 이동하고 작업 결과에 따라 SUCCEEDED, FAILED 또는 결과가 retry라면 다시 ENQUEUED로 이동할 수 있습니다. 프로세스의 어떤 시점에서든 작업을 취소할 수 있고 작업은 취소 시점에서 CANCELLED 상태로 이동합니다.
SUCCEEDED, FAILED, CANCELLED는 모두 작업의 최종 상태를 나타냅니다. 작업이 이러한 상태에 있다면 WorkInfo.State.isFinished()가 true를 반환합니다.
주기적 작업 상태
주기적 작업의 경우 최종 상태는 CANCELLED 하나만 있습니다. 주기적 작업은 종료되지 않기 때문입니다. 실행할 때마다 결과와 관계없이 작업이 다시 예약됩니다. 그림 2는 주기적 작업의 상태 다이어그램을 간략하게 보여줍니다.