Android Jetpack의 일부로 백그라운드 작업시 구글에서 권장하는 API입니다. ( API 14이상 모두 지원 )
기존에는 서비스를 생성하거나, 브로드캐스트 리시버를 사용해서 개발자가 원하는 시점에 앱을 깨워 작업할 수 있었습니다. 하지만 Target SDK 26이상부터는 제약으로 인해 WorkManager를 활용해야만 원활한 백그라운드 작업이 수행 가능합니다. 타겟이 이전인 예전 프로젝트나, 스토어에 출시하지 않는다면 기존 방법들도 사용 가능합니다. ( 현재 마켓 Target SDK는 29가 아니면 출시 불가 )
>> WorkManager를 활용한 경우
- 알람 매니저로 특정 시점에 서버 통신의 결과를 Noti로 보여줘야 하는 경우 ( 버전별 알람 매니저 적용법 )
- 알람 매니저로 특정 시점에 Room + Coroutine을 사용해야 하는 경우
- 기타 receiver를 통한 백그라운드 작업시
- 앱의 종류 여부와 상관 없이 수행해야 하는 작업
>> 적용하기
build.gradle ( project level )
allprojects {
repositories {
google()
jcenter()
}
}
build.gradle ( app level )
// coroutine work
implementation 'androidx.work:work-runtime-ktx:2.4.0'
RegisterAlarmWork.kt
Room 디비를 조회해서 알람을 등록하는 코드 입니다.
class RegisterAlarmWorker(val context: Context, params: WorkerParameters): CoroutineWorker(context, params) {
override suspend fun doWork(): Result{
DB.getInstance(context).plantDao().selectItem().let{
for(item in it){
if(item.waterAlarmTime != 0L){
AlarmUtils.register(context, item.id?:0L, item.waterAlarmTime)
}
}
}
return Result.success()
}
}
worker클래스를 상속받고 doWork()메소드를 오버라이드 해, 원하는 작업을 수행하고 처리 결과에 따라 result값을 리턴합니다. (success, failure, retry )
BootReceiver.kt
WorkManager 호출 및 사용
val registerAlarmWorkerRequest = OneTimeWorkRequest.Builder(RegisterAlarmWorker::class.java)
.build()
WorkManager.getInstance(context).enqueue(registerAlarmWorkerRequest)
- OneTimeWorkRequest : 한번만 실행할 경우 사용합니다. ( 반복 사용시 PeriodicWorkRequest 사용 )
>> 체인 기반 작업 관리
request로 작성된 여러 작업을 연결하여 순서대로 실행할 수 있습니다.
val registerAlarmWorkerRequest = OneTimeWorkRequest.Builder(RegisterAlarmWorker::class.java)
.build()
val registerAlarmWorkerRequest2 = OneTimeWorkRequest.Builder(RegisterAlarmWorker::class.java)
.build()
WorkManager.getInstance(context).beginWith(registerAlarmWorkerRequest).then(registerAlarmWorkerRequest2).enqueue()
beginWith는 한개의 work를 넣을수도 있고 array<Work>를 넣을수도 있는데, 인자로 넣어준 작업이 모두 완료된 후 then에 넘겨준 work를 실행합니다. 그리고 순차 작업이 필요한 경우 then을 계속 사용할 수 있습니다.
'안드로이드 > 코틀린' 카테고리의 다른 글
Webview 이미지 업로드 구현하기 ( 카메라, 갤러리 ) (7) | 2021.05.27 |
---|---|
[Android/Kotlin] 커스텀 뷰로 생산성 증가시키기 (0) | 2021.03.02 |
[Android/Kotlin] Transformations를 사용해 Livedata 활용하기 (0) | 2021.02.10 |
[Android/Kotlin] Room 마이그레이션 (0) | 2021.01.27 |
[Android/Kotlin] Room으로 앱내 데이터 저장하기 (0) | 2021.01.25 |