📱 Android

[Android] WorkManager

콩드로이드 2025. 4. 18. 23:42

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

 

 


백그라운드 작업을 많이 안 해봐서 접근이 어려웠지만 꼭 써먹어봐야지 ㅎㅅㅎ