WorkManager の概要

WorkManager の使用を開始するには、まずライブラリを Android プロジェクトにインポートします。

アプリの build.gradle ファイルに次の依存関係を追加します。

Groovy

dependencies {
    def work_version = "2.9.1"

    // (Java only)
    implementation "androidx.work:work-runtime:$work_version"

    // Kotlin + coroutines
    implementation "androidx.work:work-runtime-ktx:$work_version"

    // optional - RxJava2 support
    implementation "androidx.work:work-rxjava2:$work_version"

    // optional - GCMNetworkManager support
    implementation "androidx.work:work-gcm:$work_version"

    // optional - Test helpers
    androidTestImplementation "androidx.work:work-testing:$work_version"

    // optional - Multiprocess support
    implementation "androidx.work:work-multiprocess:$work_version"
}

Kotlin

dependencies {
    val work_version = "2.9.1"

    // (Java only)
    implementation("androidx.work:work-runtime:$work_version")

    // Kotlin + coroutines
    implementation("androidx.work:work-runtime-ktx:$work_version")

    // optional - RxJava2 support
    implementation("androidx.work:work-rxjava2:$work_version")

    // optional - GCMNetworkManager support
    implementation("androidx.work:work-gcm:$work_version")

    // optional - Test helpers
    androidTestImplementation("androidx.work:work-testing:$work_version")

    // optional - Multiprocess support
    implementation("androidx.work:work-multiprocess:$work_version")
}

依存関係を追加して Gradle プロジェクトを同期したら、実行する作業を定義します。

作業を定義する

作業は、Worker クラスを使用して定義します。doWork() メソッドは、WorkManager から提供されるバックグラウンド スレッドで非同期的に実行されます。

WorkManager で実行する作業を作成するには、Worker クラスを拡張して doWork() メソッドをオーバーライドします。たとえば、画像をアップロードする Worker を作成するには、以下のようにします。

Kotlin

class UploadWorker(appContext: Context, workerParams: WorkerParameters):
       Worker(appContext, workerParams) {
   override fun doWork(): Result {

       // Do the work here--in this case, upload the images.
       uploadImages()

       // Indicate whether the work 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 work here--in this case, upload the images.
     uploadImages();

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

doWork() から返された Result は、作業が成功したかどうかと、失敗した場合はその作業を再試行するかどうかを WorkManager サービスに通知します。

  • Result.success(): 作業は正常に完了しました。
  • Result.failure(): 作業は失敗しました。
  • Result.retry(): 作業が失敗したため、再試行ポリシーに従って別の時間に再試行されます。

WorkRequest を作成する

作業を定義したら、実行されるように WorkManager サービスでスケジュールを設定する必要があります。WorkManager を使用すると、作業スケジュールを柔軟に設定できます。スケジュールを設定して、作業を一定の間隔で定期的に実行することも、1 回限り実行することもできます。

作業スケジュールをどのように設定する場合でも、常に WorkRequest を使用します。Worker が作業単位を定義するのに対し、WorkRequest とそのサブクラスは、作業を実行する方法とタイミングを定義します。最も単純なケースでは、次の例に示すように、OneTimeWorkRequest を使用できます。

Kotlin

val uploadWorkRequest: WorkRequest =
   OneTimeWorkRequestBuilder<UploadWorker>()
       .build()

Java

WorkRequest uploadWorkRequest =
   new OneTimeWorkRequest.Builder(UploadWorker.class)
       .build();

システムに WorkRequest を送信する

最後に、enqueue() メソッドを使用して WorkRequestWorkManager に送信する必要があります。

Kotlin

WorkManager
    .getInstance(myContext)
    .enqueue(uploadWorkRequest)

Java

WorkManager
    .getInstance(myContext)
    .enqueue(uploadWorkRequest);

ワーカーの正確な実行タイミングは、WorkRequest とシステムの最適化で使用される制約によって異なります。WorkManager は、こうした制約の下で最善の動作を行うように設計されています。

次の手順

このスタートガイドで説明した内容は、ごく一部にすぎません。WorkRequest には追加情報(作業の実行時の制約、作業に対する入力、遅延、作業の再試行に関するバックオフ ポリシーなど)を含めることもできます。次のセクションの作業リクエストを定義するでは、これらのオプションについてさらに詳しく説明します。また、一意の作業と繰り返し作業のスケジュールを設定する方法についても説明します。

参考情報

ガイド ドキュメントのほかに、入門用のブログ、コードラボ、コードサンプルも複数用意されています。

サンプル

  • Sunflower(WorkManager などの各種のアーキテクチャ コンポーネントを使用したおすすめの方法を示すデモアプリ)

Codelab

ブログ