서론
우선, 워크매니저를 사용하기 전, 구성요소에 대해 알아보자.
워크매니저의 구성요소는 크게 네가지이다.
WorkManager
처리할 작업들을 큐에 저장해 관리한다.
여러 인스턴스가 호출되면 곤란해지기 때문에, 싱글톤 패턴으로 구현되어 있으며,
getInstance() 메서드를 사용해 인스턴스를 받아 사용한다.
Worker
추상클래스이며, doWork()메서드를 오버라이드해서 해야할 작업을 작성한다.
완료시 SUCCESS, FALURE, RETRY중 하나를 반환해야 한다.
반환한 결과에 따라 WorkManager의 이후 동작이 결정하게 된다.
WorkRequest
Worker의 doWork를 어떻게 작업할 것인지 제약사항, 실행조건, 반복여부 등의 조건을 설정한다.
반복작업과 한번만 수행할 작업으로 나누어진다. (OneTimeWorkRequest, PeriodicWorkRequest)
WorkState
WorkRequest를 고유한 id로 매핑하고, 상태를 알고있는 클래스이다.
이를 사용해 요청한 작업의 현재 상태를 알 수 있다.
(ENQUEUED, RUNNING, SUCCEEDED, FAILED, BLOCKED, CANCELLD로 총 여섯가지이다.)
사용
Server에 application의 Service가 잘 작동하고 있는지 heartbeat를 보내기 위해 최소 15분 간격으로 확인하는 예제이다.
사용전에 본인에 목적에 맞게 의존성을 app 레벨 gradle에 추가해야 한다.
dependencies {
def work_version = "2.7.0"
// (Java only)
implementation "androidx.work:work-runtime:$work_version"
// Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version"
// optional - RxJava2 support
implementation "androidx.work:work-rxjava2:$work_version"
// optional - GCMNetworkManager support
implementation "androidx.work:work-gcm:$work_version"
// optional - Test helpers
androidTestImplementation "androidx.work:work-testing:$work_version"
// optional - Multiprocess support
implementation "androidx.work:work-multiprocess:$work_version"
}
HeartbeatWorker.kt
class HeartbeatWorker(context: Context, workerParams: WorkerParameters)
: Worker(context, workerParams) {
val workName = "heartbeat"
var context = context
override fun doWork(): Result {
Log.d(workName, "heartbeat run")
Log.d(workName, "is defualt app : ${isDefualtDialer().toString()}")
Log.d(workName, "permission all permitted : ${permittedAllPermission().toString()}")
hb = Heartbeat(isDefualtDialer(), permittedAllPermission())
var isSended = heartbeatToServer(hb)
return Result.success()
}
}
기본적으로 Worker를 구현하기위한 필수 사항만을 구현한 모습이다.
현재 앱이 기본 전화앱으로 등록되어 있는지, 필요한 모든 permission의 권한을 획득했는지를 확인한다.
HeartbeatWorkerManager.kt
Worker를 WorkRequest에 담고, WorkState에 매핑해 WorkManager에 등록한다.
class HeartbeatWorkManager(con: Context) {
private val con = con
//사용자의 입력에 따라서 주기를 설정하는데, 최소 주기는 15분이다.
//시간만 입력하면 heartbeat작업을 workmanager의 작업목록에 추가한다.
fun setHeartbeatWork(frequencyOfWorkByMin: Long){
var frequencyOfWorkByMin = frequencyOfWorkByMin
if(frequencyOfWorkByMin < 15){
frequencyOfWorkByMin = 15
}
enqueueWork(heartbeatworkRequestMaker(frequencyOfWorkByMin))
}
//work class를 request에 담는다.
private fun heartbeatworkRequestMaker(frequencyOfWorkByMin: Long): PeriodicWorkRequest {
return PeriodicWorkRequestBuilder<HeartbeatWorker>(
frequencyOfWorkByMin, TimeUnit.MINUTES,
5, TimeUnit.MINUTES
).build()
}
//workrequest를 workmanager의 작업목록에 추가한다.
private fun enqueueWork(work: PeriodicWorkRequest){
WorkManager
.getInstance(con)
.enqueueUniquePeriodicWork("heartbeat", ExistingPeriodicWorkPolicy.REPLACE, work)
}
//해당 이름에 매칭되는 workrequest를 workmanager의 queue에서 제거한다.
private fun cancelWork(workName: String){
val workManager = WorkManager.getInstance(con)
workManager.cancelUniqueWork(workName)
}
}
참고
https://developer.android.com/jetpack/androidx/releases/work
'IDE & Framework > Android' 카테고리의 다른 글
[Kotlin] Fragment (2) - 기초 예제 (0) | 2021.12.19 |
---|---|
[Kotlin] Fragment (1) - Introduce (0) | 2021.12.12 |
[Kotiln] 실행아이콘이 없는, 런처가 없는 앱 만들기 (0) | 2021.11.02 |
[Kotlin] ContentResolver 기본 : 통화내역(Call log) 조회 (0) | 2021.11.02 |
AAC MVVM - (3)AAC ViewModel + ViewBinding (0) | 2021.10.17 |