개발/AOS

안드로이드 WorkManager

728x90

안드로이드에서 백그라운드 작업을 다루기 위해 여러 선택지들이 있따. Firebase JobDispatcher, Job Scheduler, Alarm Manager, Broadcast Receiver 등이 있다.

 

하지만 AccessToken등을 리프레시 할 때는 앱이나 디바이스가 재시작 되어도, 태스크의 실행을 보장한다.

 

 

작업은 Worker 클래스를 통해서 정의한다.

 

doWork() 메서드는 WorkManager에서 제공하는 백그라운드 스레드에서 비동기적으로 실행된다.

 

doWork()에서 반환된 Result는 작업의 성공 여부를 알려주며 실패한 경우 WorkManager 서비스에 작업을 재시도해야 하는지 알려줍니다.

  • Result.success(): 작업이 성공적으로 완료되었습니다.
  • Result.failure(): 작업에 실패했습니다.
  • Result.retry(): 작업에 실패했으며 재시도 정책에 따라 다른 시점에 시도되어야 합니다.

 

 

작업 요청 정의 : 

 

WorkRequest를 통해 정의한다. WorkRequest 객체에는 작업을 예약하고 실행하는데 필요한 모든 정보가 들어 있음.

 

여기에는 작업을 실행하기 위해 충족해야 하는 제약 조건, 지연 또는 반복 간격과 같은 예약 정보, 재시도 구성이 포함되어 입력 데이터를 기반으로 작업하는 경우 데이터도 포함될 수 있음

 

 

 

주기적 작업 예약 : 

 

val saveRequest =
       PeriodicWorkRequestBuilder<SaveImageToFileWorker>(1, TimeUnit.HOURS)
    // Additional configuration
           .build()

정의할 수 있는 최소 반복 간격은 15분 이다.

 

 

 

작업 제약 조건, 

 

최적의 조건이 충족될 떄까지 작업이 지연되도록 함.

 

 

NetworkType 작업을 실행하는 데 필요한 네트워크 유형을 제한합니다. 예: Wi-Fi(UNMETERED)
BatteryNotLow true로 설정하면 기기가 배터리 부족 모드인 경우 작업이 실행되지 않습니다.
RequiresCharging true로 설정하면 기기가 충전 중일 때만 작업이 실행됩니다.
DeviceIdle true로 설정하면 작업이 실행되기 전에 사용자 기기가 유휴 상태여야 합니다. 이는 사용자 기기에서 활발하게 실행되는 다른 앱의 성능에 부정적인 영향을 줄 수 있는 배치 작업을 실행하는 데 유용합니다.
StorageNotLow true로 설정하면 사용자의 기기 저장공간이 너무 부족한 경우 작업이 실행되지 않습니다.

 

 

지연된 작업

 

작업이 큐에 추가될 때 작업 제약조건이 없거나 모든 제약조건이 충족되는 경우 시스템에서 즉시 작업을 실행하기로 선택할 수 있다.

 

val myWorkRequest = OneTimeWorkRequestBuilder<MyWork>()
   .setInitialDelay(10, TimeUnit.MINUTES)
   .build()

 

 

주기적 작업 상태 

 

 

성공 및 실패 상태는 일회서 및 체이닝 된 작업에만 적용됨. 주기적 작업의 경우 최종 상태는 CACELLED 하나만 존재함. 주기적 작업은 종료되지 않기 떄문이다. 실행될 때마다 결과와 관계 없이 작업이 다시 예약된다.

 

 

 

작업 관리

 

Worker, WorkRequest를 정의 했다면 작업을 큐에 추가하는 마지막 단계만 남아있다.

 

작업을 큐에 추가하는 가장 간단한 방법은 enqueue() 메서드를 호출하여 실행하려는 WorkRequest를 전달하는 것이다

 

 

val myWork: WorkRequest = // ... OneTime or PeriodicWork
WorkManager.getInstance(requireContext()).enqueue(myWork)

 

 

고유작업 : 특정 이름의 작업 인스턴스가 한 번에 하나만 있도록 보장하는 강력한 개념