WorkManager는 처음 사용해봐서 정리해두려고 함,, 🫠
✅ WorkManager란?
- Android Jetpack의 백그라운드 작업 처리 라이브러리
- 네트워크 연결 상태, 충전 중 여부 등 다양한 제약 조건 설정 가능
언제 사용하면 좋을까 ?
- 작업이 백그라운드에서도 꼭 실행돼야 할 때 (ex. 업로드 같은 동작)
- 네트워크 활성화 / 충전 중 등 조건을 걸고 싶을 때
- 주기적으로 실행되어야 할 때 (ex. 하루에 한 번 데이터 전송 예약)
🛠 WorkManager 구성요소
Worker
- 실제 작업을 정의한 클래스 즉, doWork() 구현
- 작업 방식(동기 / 코루틴 / RxJava)에 따라 Worker는 Worker, CoroutineWorker, RxWorker 3가지 타입으로 나뉨
class MyWorker(
context: Context,
workerParams: WorkerParameters
) : CoroutineWorker(context, workerParams) {
override suspend fun doWork(): Result {
val input = inputData.getString("key")
// TODO: 비동기 작업 수행 (예: 네트워크 요청, 파일 저장 등)
return Result.success()
}
}
WorkRequest
- 어떤 작업을 어떻게 실행할지 방법을 정의
- 한 번만 실행 → OneTimeWorkRequestBuilder
정기적 실행 → PeriodicWorkRequestBuilder
val work = OneTimeWorkRequestBuilder<MyWorker>()
.setInputData(workDataOf("key" to "odense"))
.build()
WorkManager
- 작업을 큐에 넣고 실행하는 핵심 요소
WorkManager.getInstance(context).enqueue(work)
Constraints (optional)
- 제약 조건 설정
- 와이파이 연결됐을 때만 작업하고 싶을 때
- 충전 중일 때만 실행되게 하고 싶을 때
- 기기가 *유휴 상태일 때만 실행되게 하고 싶을 때
유휴 상태가 필요하나 싶었는데 예를 보니까 필요할 때도 있을 거 같다,,
사용자가 기기를 안 만지는 상태 (잠김, 화면 꺼짐 등), 백그라운드에서 시스템이 쉬는 상태
val constraints = Constraints.Builder()
.setRequiresCharging(true)
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresDeviceIdle(true)
.build()
즉 간단하게 줄이자면
Worker : 할 일 정의
WorkRequest : 할 일 요청
Constraints : 특정 조건을 걸지 말지
WorkManager : 실행 담당
전체 코드
class MyWorker(
context: Context,
workerParams: WorkerParameters
) : CoroutineWorker(context, workerParams) {
override suspend fun doWork(): Result {
val value = inputData.getString("key")
Log.d("MyWorker", "값 받음: $value")
// TODO: 백그라운드에서 수행할 작업
return Result.success()
}
}
// 보통 Activity, ViewModel 등에 작성됨
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresCharging(true)
.build()
val work = OneTimeWorkRequestBuilder<MyWorker>()
.setInputData(workDataOf("key" to "odense"))
.setConstraints(constraints)
.build()
WorkManager.getInstance(context).enqueue(work)
어떤 파일에 어떤 구성 요소가 들어가야하는지 헷갈릴 수 있다
구조를 보자면 아래와 같다
📂 project
├── 📁 work
MyWorker.kt ← Worker 클래스 정의
├── 📂 ui 관련
MainActivity.kt ← WorkerRequest, WorkerManager, constraints
백그라운드 작업을 많이 안 해봐서 접근이 어려웠지만 꼭 써먹어봐야지 ㅎㅅㅎ
'📱 Android' 카테고리의 다른 글
[Android] 클린 아키텍처 적용 시 고민했던 3가지 의문점 (0) | 2025.04.12 |
---|---|
[Android / RecyclerView] onCreateViewHolder vs onBindViewHolder: 클릭 리스너는 어디에 둘까? (0) | 2025.04.07 |
[Android] LiveData - observeForever (0) | 2025.03.21 |
[Android] ViewPager2 감도 조절하기 (0) | 2025.02.08 |
[Android] AAC의 LiveData, ViewModel의 LiveData (0) | 2025.02.04 |