안드로이드/정리(Android)

Android) WorkManager 워크매니저

김염인 2022. 9. 11. 23:37

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 동작 구조

 

 

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)

https://medium.com/androiddevelopers/workmanager-basics-beba51e94048

 

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 확인하기