WorkManager로 작업 예약  Android Jetpack의 구성요소

WorkManager는 지속적인 작업에 권장되는 솔루션입니다. 앱이 다시 시작되거나 시스템이 재부팅될 때 작업이 예약된 채로 남아 있으면 그 작업은 유지됩니다. 대부분의 백그라운드 처리는 지속적인 작업을 통해 가장 잘 처리되므로 WorkManager는 백그라운드 처리에 권장하는 기본 API입니다.

지속적인 작업의 유형

WorkManager가 처리하는 지속적인 작업의 유형은 세 가지입니다.

  • 즉시: 즉시 시작하고 곧 완료해야 하는 작업입니다. 신속하게 처리될 수 있습니다.
  • 장기 실행: 더 오래(10분 이상이 될 수 있음) 실행될 수 있는 작업입니다.
  • 지연 가능: 나중에 시작하며 주기적으로 실행될 수 있는 예약된 작업입니다.

그림 1은 다른 유형의 지속적인 작업이 서로 어떻게 연관이 있는지 보여줍니다.

지속적인 작업은 즉시 또는 장기적으로 실행되거나 실행이 지연될 수 있습니다.
그림 1: 지속적인 작업의 유형

마찬가지로 다음 표는 다양한 작업 유형을 간단히 보여줍니다.

유형 주기성 액세스 방법
즉시 1회 OneTimeWorkRequestWorker.

신속 처리 작업의 경우 OneTimeWorkRequest에서 setExpedited()를 호출합니다.

장기 실행 1회 또는 주기적 모든 WorkRequest 또는 Worker. Worker에서 setForeground()를 호출하여 알림을 처리합니다.
지연 가능 1회 또는 주기적 PeriodicWorkRequestWorker

WorkManager 설정 방법에 관한 자세한 내용은 WorkRequests 정의 가이드를 참고하세요.

특징

WorkManager는 더 간단하고 일관성 있는 API를 제공할 뿐만 아니라 여러 가지 중요한 이점을 제공합니다.

작업 제약 조건

작업 제약 조건을 사용하여 작업을 실행하는 데 최적인 조건을 선언적으로 정의합니다. 예를 들어, 기기가 무제한 네트워크에 있을 때 또는 기기가 유휴 상태이거나 배터리가 충분할 때만 실행합니다.

강력한 예약 관리

WorkManager를 사용하면 가변 일정 예약 기간을 통해 한 번 또는 반복적으로 실행할 작업을 예약할 수 있습니다. 작업에 태그 및 이름을 지정하여 고유 작업 및 대체 가능한 작업을 예약하고 작업 그룹을 함께 모니터링하거나 취소할 수 있습니다.

예약된 작업은 내부적으로 관리되는 SQLite 데이터베이스에 저장되며 WorkManager에서 기기를 재부팅해도 작업이 유지되고 다시 예약되도록 보장합니다.

또한 WorkManager는 절전 기능을 사용하고 권장사항(예: 잠자기 모드)을 준수하므로 배터리 소모를 걱정하지 않아도 됩니다.

신속 처리 작업

WorkManager를 사용하여 백그라운드에서 즉시 실행할 작업을 예약할 수 있습니다. 사용자에게 중요하고 몇 분 내에 완료되는 작업에는 신속 처리 작업을 사용해야 합니다.

유연한 재시도 정책

경우에 따라 작업이 실패하기도 합니다. WorkManager는 구성 가능한 지수 백오프 정책을 비롯해 유연한 재시도 정책을 제공합니다.

작업 체이닝

복잡한 관련 작업의 경우 직관적인 인터페이스를 사용하여 개별 작업을 함께 체이닝하면 순차적으로 실행할 작업과 동시에 실행할 작업을 제어할 수 있습니다.

Kotlin


val continuation = WorkManager.getInstance(context)
    .beginUniqueWork(
        Constants.IMAGE_MANIPULATION_WORK_NAME,
        ExistingWorkPolicy.REPLACE,
        OneTimeWorkRequest.from(CleanupWorker::class.java)
    ).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java))
    .then(
        if (save) {
            workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT)
        } else /* upload */ {
            workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT)
        }
    )

자바


WorkManager.getInstance(...)
.beginWith(Arrays.asList(workA, workB))
.then(workC)
.enqueue();

각 작업에 대해 작업의 입력 데이터와 출력 데이터를 정의할 수 있습니다. 작업을 함께 체이닝하면 WorkManager가 자동으로 한 작업의 출력 데이터를 다음 작업으로 전달합니다.

내장 스레딩 상호 운용성

WorkManager는 코루틴RxJava원활하게 통합되며 자체 비동기 API를 연결할 수 있는 유연성을 제공합니다.

안정적인 작업에 WorkManager 사용하기

WorkManager는 사용자가 화면을 벗어나 이동하거나, 앱이 종료되거나, 기기가 다시 시작되더라도 안정적으로 실행되어야 하는 작업을 대상으로 설계되었습니다. 예를 들면 다음과 같습니다.

  • 백엔드 서비스에 로그 또는 분석 전송
  • 주기적으로 서버와 애플리케이션 데이터를 동기화

WorkManager는 앱 프로세스가 사라지더라도 안전하게 종료될 수 있는 진행 중인 백그라운드 작업을 위한 것이 아닙니다. 즉각적인 실행이 필요한 모든 작업을 위한 일반적인 솔루션도 아닙니다. 요구사항에 맞는 적합한 솔루션을 알아보려면 백그라운드 처리 가이드를 검토하세요.

다른 API와의 관계

코루틴은 특정 사용 사례에 권장되는 솔루션이지만, 지속적인 작업에 사용해서는 안 됩니다. 코루틴은 동시 실행 프레임워크이고 WorkManager는 지속적인 작업을 위한 라이브러리라는 점에 유의하세요. 마찬가지로, AlarmManager는 시계 또는 캘린더에만 사용해야 합니다.

API 추천 대상 WorkManager와의 관계
코루틴 지속적이지 않은 모든 비동기 작업 코루틴은 Kotlin에서 기본 스레드를 벗어나는 표준 방식이지만, 앱이 종료된 후에는 메모리를 남겨둡니다. 지속적인 작업의 경우 WorkManager를 사용합니다.
AlarmManager 알람에만 사용 WorkManager와 달리 AlarmManager는 잠자기 모드인 기기의 절전 모드를 해제합니다. 따라서 전원 및 리소스 관리 측면에서는 비효율적입니다. 백그라운드 작업이 아닌 정확해야 하는 알람이나 알림(예: 캘린더 일정)에만 사용하세요.

지원 중단된 API 교체

WorkManager API는 FirebaseJobDispatcher, GcmNetworkManager, Job Scheduler를 비롯하여 이전의 모든 Android 백그라운드 작업 예약 API를 대체할 때 권장하는 API입니다.

시작하기

앱에서 WorkManager를 사용하려면 시작 가이드를 확인하세요.

추가 리소스

동영상

블로그