https://developer.android.com/topic/libraries/architecture/workmanager?hl=ko
앱 아키텍처: 데이터 영역 - WorkManager로 작업 예약 - Android 개발자 | Android Developers
데이터 영역 라이브러리에 관한 이 앱 아키텍처 가이드를 통해 지속적인 작업 유형과 기능 등을 알아보세요.
developer.android.com
안드로이드에서 지속적인 작업 을 진행할 경우, WorkManager를 사용해야 한다.
여기서 말하는 지속적인 작업 이란
1️⃣ 즉시 실행 : 즉시 시작하고 곧 완료해야 하는 작업. 신속처리 제공
2️⃣ 장기 실행 : 오래(ex - 10분 이상) 실행되는 작업
3️⃣ 지연 가능 : 나중에 시작하거나 주기적으로 실행될 수 있는 예약된 작업
의 3가지 경우를 말한다.
WorkManager는 앱이 다시 시작되거나 시스템이 재부팅될 때 작업이 예약된 채로 남아 있으면 그 작업은 유지된다.
즉, WorkManager는 반드시 실행 된다.
이 글에선 지연 가능(주기적 작업)한 작업을 위한 WorkManager를 사용해보려고 한다.
1️⃣ Dependency 추가
dependencies {
def work_version = "2.7.1"
// Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version"
}
https://developer.android.com/topic/libraries/architecture/workmanager/basics?hl=ko
WorkManager 시작하기 | Android 개발자 | Android Developers
WorkManager 시작하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. WorkManager를 사용하기 위해 먼저 라이브러리를 Android 프로젝트로 가져옵니다. 앱의 build.grad
developer.android.com
여러 버전은 공식문서에서 확인할 수 있다.
2️⃣ Worker Class 정의
class LogWorker(appContext: Context, workerParams: WorkerParameters)
: Worker(appContext, workerParams) {
override fun doWork(): Result {
Log.d("test5", "doWork: 통신")
return Result.success()
}
}
Worker 클래스를 상속받는 클래스를 생성하여
생성자로 Context, WorkerParameters 를 넘겨준다.
그 후, 처리할 작업을 doWork 메서드를 오버라이드 하여 작성해준다.
1️⃣ Result.success() : 작업 성공
2️⃣ Result.failure() : 작업 실패
3️⃣ Result.retry() : 작업 실패, 재시도 정책에 따라 재시도
doWork메소드에서 반환하는 Result 값을 통해 WorkManager에게 성공, 실패, 재시도 여부를 알려줄 수 있다.
class LogWorker(appContext: Context, workerParams: WorkerParameters)
: CoroutineWorker(appContext, workerParams) {
override fun doWork(): Result{
Log.d("test5", "doWork: 비동기 통신")
return Result.success()
}
}
비동기 통신 의 경우 CoroutineWorker 클래스를 통해 진행할 수 있다.
3️⃣ 작업 요청, 취소하기
// 주기 설정. 최소 15분
private val workRequest: PeriodicWorkRequest =
PeriodicWorkRequestBuilder<LogWorker>(15, TimeUnit.MINUTES)
.build()
PeriodicWorkRequest 를 통해 위에서 정의한 Worker 작업을 생성한다.
주기를 설정할 수 있으며 최소 주기는 15분이다.
workManager = WorkManager.getInstance(applicationContext)
이제 getInstance 를 통해 WorkManager 객체를 생성해주고
// 워크매니저 시작
fun startWorkManager() {
workManager.enqueueUniquePeriodicWork(
UNIQUE_NAME,
ExistingPeriodicWorkPolicy.KEEP, // 충돌 정책 : 기존 작업을 유지하고 새 작업을 무시
workRequest
)
// 워크 매니저 상태 확인
val state = workManager.getWorkInfosForUniqueWork(UNIQUE_NAME).get()
for(i in state){
Log.d("test5", "startWorkManager: $state")
}
}
// 워크매니저 종료
fun stopWorkManager() {
workManager.cancelUniqueWork(UNIQUE_NAME)
// 워크 매니저 상태 확인
val state = workManager.getWorkInfosForUniqueWork(UNIQUE_NAME).get()
for(i in state){
Log.d("test5", "stopWorkManager: $state")
}
}
enqueueUniquePeriodicWork 를 통해 특정 태그로 작업을 대기열에 enque 하여 작업을 시작할 수 있다.
또한 cancelUniqueWork 를 통해 특정 태그 작업을 종료할 수 있다.
getWorkInfosForUniqueWork 를 사용하면 워크매니저의 상태를 확인할 수 있다.
전체 코드
https://github.com/HanYeop/Jetpack-Compose/tree/master/WorkManagerEx
GitHub - HanYeop/Jetpack-Compose: Jetpack Compose 사용해보기
Jetpack Compose 사용해보기. Contribute to HanYeop/Jetpack-Compose development by creating an account on GitHub.
github.com
참고
https://developer.android.com/topic/libraries/architecture/workmanager?hl=ko