본문 바로가기

안드로이드/코틀린

[안드로이드/Kotlin] WorkManager를 활용한 백그라운드 작업

반응형

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을 계속 사용할 수 있습니다. 

 

 

 

반응형