Android WorkManager
안드로이드의 백그라운드 작업
실행시점에 따른 분류
1) Exact Timing : 즉시처리 되어야 하는 작업
2) Deferrable : 처리를 위한 조건이 만족될 때까지 기다릴 수 있는 작업
실행 완료에 따른 분류
1) Best-Effort : 처리를 위해 노력하지마 취소될 수도 있는 작업
2) Guaranteed Execution : 앱이 종료 되거나 기기가 재부팅 돼도 수행돼야 하는 작업

안드로이드 백그라운드 API의 변천 과정
- API 23(Marshmallow) : Doze and App Standby
- API 24(Nougat) : Doze on-the-go, Limited implicit broadcasts
- API 26(Oreo) : Background service limitations, Implicit Broadcast Exceptions, Release cached wakelocks
- API 28(Pie) : App Standby Buckets, Battery Saver mode
- API 29(Quince Tart) : Restrictions on starting activities API 30(Red Velvet Cake) : Background location access
- API 31(Snow Cone) : Foreground service launch restrictions, Phantom Processes
버전에 따라 서로 다른 백그라운드 적용을하는 것은 까다로움, 잘못설계 할 경우 유저에 따라 백그라운드 작업을 할 수 없을 수 있음
따라서 구글은 2016년 구글 I/O에서 Firebase JobDispacher를 제공, 그 이후는 WorkManager 등장,
Firebase JobDispacher
- API 9+
- 'AlarmManager'와 'JobSheduler'를 알아서 선택
- 버전간에 구분 필요 없음
- Google Play Service 필요(중국시장 대응 X)
WorkManager
- Guaranteed, constraint-aware execution : 실행이 보장되며 제약조건을 붙일 수 있습니다. 예를 들면 네트워크 연결시 에만 작업이 처리되도록 할 수 있습니다.
- Respectful of system background restrictions : 장치의 상태를 존중합니다. 예를들어 앱이 도즈모드일 경우 작업 처리 를 위해 기기를 깨우지 않습니다.
- Backwards compatible with or without Google Play Services : 구글 플레이 서비스와 관계없이 동작합니다.
- Queryable : 작업이 실행/대기중인지? 성공/실패했는지 등의 상태조회를 할 수 있습니다.
- Chainable : 작업 A, B 결과에 따라 처리되는 작업 C를 만들고, 다시 C의 결과에 의존하는 작업 D를 만들 수 있습니다.
- Opportunistic : 사용자를 간섭하지 않아도 제약조건이 만족되면 작업이 즉시 실행됩니다.


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()
}
}

workmanager의 구조(workRequest 만들기)
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresCharging(true)
.build()
val uploadWorkRequest: WorkRequest =
OneTimeWorkRequestBuilder<UploadWorker>()
.setConstraints(constraints)
.build()
WorkManager의 구조 (WorkRequest 제출)
1 WorkManager.getInstance(myContext).enqueue(uploadWorkRequest)

WorkManager의 구조 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>>
Work Sates 확인하기

'안드로이드 > 정리(Android)' 카테고리의 다른 글
| Android) MVC, MVP, MVVM 아키텍처 비교 및 구현 (0) | 2022.10.29 |
|---|---|
| 안드로이드 HTTP 통신 (2) | 2022.09.09 |
| Android) Databinding 정리 (0) | 2022.08.16 |
| Android - Hilt(의존성주입) (0) | 2022.08.15 |
| [Android] ViewModel 알아보기 (0) | 2022.08.04 |