GCMNetworkManager에서 WorkManager로 이전

이 문서에서는 GCMNetworkManager 라이브러리 대신 WorkManager 클라이언트 라이브러리를 사용하여 백그라운드 작업을 실행하도록 앱을 이전하는 방법을 설명합니다. 앱이 백그라운드 작업을 예약하는 가장 좋은 방법은 WorkManager를 사용하는 것입니다. 또한, WorkManager GCM 라이브러리를 포함하여 API 수준 22 이하를 실행하는 Android 기기에서 GCM을 사용하여 작업을 예약하도록 WorkManager를 사용 설정할 수 있습니다.

WorkManager로 이전

앱이 현재 GCMNetworkManager를 사용하여 백그라운드 작업을 실행한다면 다음 단계에 따라 WorkManager로 이전합니다.

이러한 단계에서는 작업을 정의하고 예약하는 아래와 같은 GCMNetworkManager 코드로 시작한다고 가정합니다.

Kotlin

val myTask = OneoffTask.Builder()
    // setService() says what class does the work
    .setService(MyUploadService::class.java)
    // Don't run the task unless device is charging
    .setRequiresCharging(true)
    // Run the task between 5 & 15 minutes from now
    .setExecutionWindow(5 * DateUtil.MINUTE_IN_SECONDS,
            15 * DateUtil.MINUTE_IN_SECONDS)
    // Define a unique tag for the task
    .setTag("test-upload")
    // ...finally, build the task and assign its value to myTask
    .build()
GcmNetworkManager.getInstance(this).schedule(myTask)

Java

// In GcmNetworkManager, this call defines the task and its
// runtime constraints:
OneoffTask myTask = new OneoffTask.Builder()
    // setService() says what class does the work
    .setService(MyUploadService.class)
    // Don't run the task unless device is charging
    .setRequiresCharging(true)
    // Run the task between 5 & 15 minutes from now
    .setExecutionWindow(
        5 * DateUtil.MINUTE_IN_SECONDS,
        15 * DateUtil.MINUTE_IN_SECONDS)
    // Define a unique tag for the task
    .setTag("test-upload")
    // ...finally, build the task and assign its value to myTask
    .build();
GcmNetworkManager.getInstance(this).schedule(myTask);

이 예에서는 MyUploadService가 실제 업로드 작업을 정의한다고 가정합니다.

Kotlin

class MyUploadService : GcmTaskService() {
    fun onRunTask(params: TaskParams): Int {
        // Do some upload work
        return GcmNetworkManager.RESULT_SUCCESS
    }
}

Java

class MyUploadService extends GcmTaskService {
    @Override
    public int onRunTask(TaskParams params) {
        // Do some upload work
        return GcmNetworkManager.RESULT_SUCCESS;
    }
}

WorkManager 라이브러리 포함

WorkManager 클래스를 사용하려면 빌드 종속 항목에 WorkManager 라이브러리를 추가해야 합니다. 또한, 앱이 JobScheduler를 지원하지 않는 기기에서 실행 중(즉, 기기가 API 수준 22 이하에서 실행 중)인 경우 WorkManager를 사용 설정하여 작업 예약에 GCM을 사용하도록 WorkManager GCM 라이브러리를 추가해야 합니다. 라이브러리 추가에 관한 자세한 내용은 WorkManager 시작하기를 참고하세요.

매니페스트 수정

GCMNetworkManager를 구현할 때 GcmNetworkManager 참고 문서에 설명된 대로 앱 매니페스트에 GcmTaskService의 인스턴스를 추가했습니다. GcmTaskService는 수신되는 작업을 확인하고 작업 핸들러에 위임합니다. WorkManager에서 작업자에게 작업을 위임하는 일을 관리하므로 더 이상 이 작업을 실행하는 클래스가 필요하지 않습니다. 따라서 간단히 매니페스트에서 GcmTaskService를 삭제하면 됩니다.

작업자 정의

GCMNetworkManager 구현은 완료해야 하는 작업만 지정하는 OneoffTask 또는 RecurringTask를 정의합니다. 이 구현은 작업 요청 정의에 설명한 대로 Worker로 다시 작성해야 합니다.

샘플 GCMNetworkManager 코드myTask 작업을 정의합니다. WorkManager에 상응하는 부분은 다음과 같습니다.

Kotlin

class UploadWorker(context: Context, params: WorkerParameters)
                        : Worker(context, params) {
    override fun doWork() : Result {
        // Do the upload operation ...
        myUploadOperation()

        // Indicate whether the task finished successfully with the Result
        return Result.success()
    }
}

Java

public class UploadWorker extends Worker {

    public UploadWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Result doWork() {
      // Do the upload operation ...

      myUploadOperation()

      // Indicate whether the task finished successfully with the Result
      return Result.success()
    }
}

GCM 작업과 Worker 사이에는 몇 가지 차이점이 있습니다.

  • GCM은 TaskParams 객체를 사용하여 작업에 매개변수를 전달합니다. 작업의 입력/출력 정의에 관한 WorkManager 문서에 설명한 대로 WorkManagerWorkRequest에 지정할 수 있는 입력 데이터를 사용합니다. 두 경우 모두 작업에 필요한 모든 지속 가능한 매개변수를 지정하여 키-값 쌍을 전달할 수 있습니다.
  • GcmTaskServiceGcmNetworkManager.RESULT_SUCCESS 같은 플래그를 반환하여 성공 또는 실패 여부를 나타냅니다. WorkManager WorkerListenableWorker.Result.success() 같은 ListenableWorker.Result 메서드를 사용하고 그 메서드의 반환 값을 반환하여 결과를 나타냅니다.
  • 앞서 언급했듯이 Worker를 정의할 때는 제약 조건이나 태그를 설정하지 않습니다. 대신 다음 단계에서 WorkRequest를 만들 때 이 작업을 실행합니다.

작업 요청 예약

Worker 정의는 실행해야 할 을 지정합니다. 작업이 완료되어야 하는 시기를 지정하려면 다음과 같이 WorkRequest를 정의해야 합니다.

  1. OneTimeWorkRequest 또는 PeriodicWorkRequest를 만들고 원하는 제약 조건을 설정하여 작업을 식별할 태그와 작업의 실행 시기를 지정합니다.
  2. WorkManager.enqueue()에 요청을 전달하여 작업을 실행 큐에 추가합니다.

예를 들어 이전 섹션에서 OneoffTask를 이에 상응하는 Worker로 변환하는 방법을 보았습니다. 그러나 WorkerOneoffTask 객체의 실행 제약 조건 및 태그를 포함하지 않았습니다. 대신 WorkRequest를 만들 때 제약 조건과 작업 ID를 설정합니다. 또한 네트워크 연결이 없으면 작업이 실행되지 않도록 지정합니다. GCMNetworkManager는 기본적으로 네트워크 연결이 필요하기 때문에 이를 명시적으로 요청할 필요가 없지만, WorkManager는 명확하게 제약 조건을 추가하지 않으면 네트워크 연결을 요구하지 않습니다. WorkRequest를 정의했으면 WorkManager를 이용하여 큐에 추가합니다.

Kotlin

val uploadConstraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true).build()

val uploadTask = OneTimeWorkRequestBuilder<UploadWorker>()
    .setConstraints(uploadConstraints)
    .build()
WorkManager.getInstance().enqueue(uploadTask)

Java

Constraints uploadConstraints = new Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true)
    .build();

OneTimeWorkRequest uploadTask =
        new OneTimeWorkRequest.Builder(UploadWorker.class)
  .setConstraints(uploadConstraints)
  .build();
WorkManager.getInstance().enqueue(uploadTask);

API 매핑

이 섹션에서는 일부 GCMNetworkManager 기능 및 제약 조건이 상응하는 WorkManager에 매핑되는 방식을 설명합니다.

제약 조건 매핑

GCMNetworkManager를 사용하면 작업을 실행해야 하는 시기에 관해 몇 가지 제약 조건을 설정할 수 있습니다. 대부분의 경우 이에 상응하는 WorkManager의 명확한 제약 조건이 있습니다. 이 섹션에는 상응하는 항목이 나열되어 있습니다.

작업의 빌더 객체에서 적절한 메서드를 호출하여 GCMNetworkManager 작업에 관한 제약 조건을 설정하세요. 예를 들어 Task.Builder.setRequiredNetwork()를 호출하여 네트워크 요구사항을 설정할 수 있습니다.

WorkManager에서 Constraints.Builder 객체를 만들고 제약 조건을 설정할 객체의 메서드를 호출합니다(예: Constraints.Builder.setRequiredNetworkType())). 그런 다음 빌더를 사용하여 작업 요청에 첨부할 수 있는 Constraints 객체를 만듭니다. 자세한 내용은 작업 요청 정의를 참고하세요.

GCMNetworkManager 제약 조건 GCMNetworkManager에 상응하는 WorkManager Notes
setPersisted() (필요 없음) 모든 WorkManager 작업은 기기 재부팅 시에도 유지됩니다.
setRequiredNetwork() setRequiredNetworkType() 기본적으로 GCMNetworkManager에는 네트워크 액세스가 필요합니다. WorkManager는 기본적으로 네트워크 액세스가 필요하지 않습니다. 작업에 네트워크 액세스가 필요하다면 setRequiredNetworkType(CONNECTED)을 사용하거나 보다 구체적인 네트워크 유형을 설정해야 합니다.
setRequiresCharging()

기타 매핑

제약 조건 외에도 GCMNetworkManager 작업에 적용할 수 있는 다른 설정이 있습니다. 이 섹션에서는 이러한 설정을 WorkManager 작업에 적용하는 방법을 설명합니다.

태그

모든 GCMNetworkManager 작업에는 빌더의 setTag() 메서드를 호출하여 설정한 태그 문자열이 있어야 합니다. WorkManager 작업은 WorkManager에서 자동으로 생성되는 ID로 고유하게 식별되며, ID는 WorkRequest.getId()를 호출하여 가져올 수 있습니다. 또한 작업 요청은 선택적으로 하나 이상의 태그를 포함할 수 있습니다. WorkManager 작업의 태그를 설정하려면 빌더를 사용하여 WorkRequest를 만들기 전에 WorkRequest.Builder.addTag() 메서드를 호출합니다.

GCMNetworkManager에서는 setUpdateCurrent()를 호출하여 작업이 동일한 태그가 지정된 기존 작업을 대체해야 하는지를 지정합니다. 이와 동등한 접근 방식으로 WorkManager에서는 enqueueUniqueWork() 또는 enqueueUniquePeriodicWork()를 호출하여 작업을 큐에 추가할 수 있습니다. 이러한 메서드를 사용할 경우 작업에 고유한 이름을 지정합니다. 동일한 이름을 가진 대기 중인 작업이 이미 있다면 WorkManager에서 요청을 처리할 방식을 지정하세요. 자세한 내용은 고유 작업 처리를 참고하세요.

작업 매개변수

Task.Builder.setExtras()를 호출하고 매개변수가 포함된 Bundle을 전달하여 매개변수를 GCMNetworkManager 작업에 전달할 수 있습니다. WorkManager를 사용하면 매개변수를 키-값 쌍으로 포함하는 Data 객체를 WorkManager 작업에 전달할 수 있습니다. 자세한 내용은 입력 데이터 할당을 참고하세요.