WorkManager — 概要、API、タスクスケジューリング

著者: IT Sectr 公開日: 2026-03-27 読了時間: 8 分

WorkManagerは、遅延タスクおよびバックグラウンドタスクを確実に実行するためのAndroid Jetpackライブラリです。ServiceやJobSchedulerとは異なり、WorkManagerはタスクのライフサイクルを管理します。障害時には再起動し、Androidバージョンに適応し、デバイスの制約を考慮します。Android Developers, 2026によると、WorkManagerは最新のAndroid開発におけるほとんどのバックグラウンド操作に推奨されるソリューションです。

重要なポイント

  • WorkManagerは、Androidバージョンに関係なく確実に実行されるバックグラウンドタスクのためのJetpackライブラリです。
  • Workerはバックグラウンドタスクのロジックを定義するための基本クラスで、ライブラリが別のスレッドで実行します。
  • WorkRequestは、1回限り(OneTimeWorkRequest)と定期的(PeriodicWorkRequest、最小間隔15分)があります。
  • タスクチェーンにより、複数のWorkerを順次または並行して実行できます。
  • 制約により、開始条件(バッテリー残量、ネットワーク接続、ストレージ状態)を定義します。

WorkManagerとは?

WorkManagerはAndroid Jetpackの一部であり、アプリがフォアグラウンドにあるかユーザーによって閉じられたかに関係なく、確実に実行されるバックグラウンドタスクを管理するためのライブラリです。このライブラリはAPI 14+をサポートし、適切な実行メカニズムを自動的に選択します:Android 5+ではJobScheduler、古いバージョンではBroadcastReceiver + AlarmManager。

WorkManagerの主な機能は確実な実行です。デバイスの再起動、アプリの終了、またはクラッシュによりタスクが完了しなかった場合、WorkManagerは最初の機会に再起動します。これにより、ライブラリは実行が重要なタスク(分析情報の送信、データベース同期、ログのアップロード)に理想的な選択肢となります。

Background Serviceとは異なり、WorkManagerはスレッドとライフサイクルの管理を必要としません。ライブラリ自体がスレッドプールを作成し、Doze Modeを処理し、Androidバージョンを考慮し、APIレベルに関係なく統一されたAPIを提供します。CoroutineおよびRxJavaのサポートは、それぞれCoroutineWorkerおよびRxWorkerを介して利用できます。

LiveDataによる状態監視

WorkManagerは、タスクの状態を追跡するための組み込みのLiveDataサポートを提供します。getWorkInfoByIdLiveDataメソッドはLiveData<WorkInfo>を返し、ENQUEUED、RUNNING、SUCCEEDED、FAILED、CANCELLEDの各状態変更時に更新されます。これにより、UIコンポーネントはLifecycle-awareコンポーネントのおかげで、スケジューラーを手動でポーリングしたりメモリリークを発生させたりすることなく、変更に反応できます。

kotlin
WorkManager.getInstance(context)
    .getWorkInfoByIdLiveData(syncRequest.id)
    .observe(viewLifecycleOwner) { workInfo ->
        when (workInfo.state) {
            WorkInfo.State.SUCCEEDED ->
                showSuccess()
            WorkInfo.State.FAILED ->
                showError(workInfo.outputData)
            else ->
                showProgress()
        }
    }

WorkManagerの仕組み

WorkManagerのアーキテクチャは、Worker、WorkRequest、WorkManagerの3つの基本クラスを中心に構築されています。Workerはタスクロジックを含み、WorkRequestは実行パラメーターを記述し、WorkManagerはキューとスケジューリングを管理します。ライブラリは内部のRoomデータベースを使用してすべてのタスクの状態を保存します。

WorkerとWorkRequest

Workerは抽象クラスで、バックグラウンドスレッドで呼び出される単一のメソッドdoWorkを持ちます。このメソッドはListenableWorker.Result — SUCCESS、FAILURE、またはRETRYを返します。WorkRequestはWorkerをパラメーター(タイムアウト、タグ、初期遅延、制約)に結び付けます。

kotlin
class SyncWorker(
    context: Context,
    params: WorkerParameters
) : Worker(context, params) {

    override fun doWork(): Result {
        return try {
            val api = RetrofitClient.api
            val response = api.syncData()
            Result.success()
        } catch (e: Exception) {
            Result.retry()
        }
    }
}

WorkManagerによるスケジューリング

WorkManagerは、Androidバージョンに関係なくタスクを均一にスケジュールします。enqueueを呼び出すと、ライブラリはタスクをRoomに保存し、現在の条件を評価し、最適な実行時間を選択します。内部的には、JobScheduler、AlarmManager、または独自のスケジューラーを使用する場合があり、開発者はそのことを心配する必要はありません。

kotlin
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInitialDelay(15, TimeUnit.MINUTES)
    .addTag("sync")
    .build()

WorkManager.getInstance(context)
    .enqueue(syncRequest)

WorkRequestの種類

WorkManagerは、1回限りと定期限の2種類の実行リクエストをサポートしています。タイプの選択はシナリオに依存します:タスクを1回実行するか、指定された間隔で繰り返すか。

OneTimeWorkRequest

OneTimeWorkRequestは、1回だけ実行する必要があるタスク向けに設計されています。ログの送信、認証後のデータ同期、初回起動時の設定ダウンロードなどが該当します。遅延はsetInitialDelay、制約はsetConstraintsで設定します。

PeriodicWorkRequest

PeriodicWorkRequestは、最小間隔15分の繰り返しタスクに適しています。ライブラリは、実行間隔が指定された間隔より短くならないことを保証しますが、デバイスの制約により長くなる可能性があります。15分未満の頻度のタスクには、Foreground ServiceでHandlerまたはTimerを使用してください。

パラメーターOneTimeWorkRequestPeriodicWorkRequest
頻度1回限り繰り返し(最小15分)
回数1回の実行キャンセルまで
遅延setInitialDelaysetInitialDelay
チェーン対応不可
使用例ダウンロード、同期監視、ポーリング

制約の設定とタスクチェーン

WorkManagerの制約により、タスクを開始できる条件を設定できます:ネットワーク接続(NetworkType)、バッテリーレベル(batteryNotLow)、ストレージ状態(StorageNotLow)、アイドルモード(DeviceIdle)。すべての制約が満たされるまでタスクは開始されません。

kotlin
val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true)
    .setRequiresBatteryNotLow(true)
    .build()

val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
    .setConstraints(constraints)
    .build()

チェーンにより、タスクの順次実行または並列実行を整理できます。beginWithでチェーンを開始し、thenで次のWorkerを追加します。これは前のWorkerの正常完了後に実行されます。並列実行には、workManager.enqueue(listOf(request1, request2))を使用します。

kotlin
WorkManager.getInstance(context)
    .beginWith(compressWorker)
    .then(uploadWorker)
    .then(cleanupWorker)
    .enqueue()
    // compress -> upload -> cleanup 順次実行

JobSchedulerからWorkManagerへの移行

JobSchedulerはAndroid 5(API 21)でバックグラウンドタスクをスケジュールするためのシステムサービスとして導入されました。WorkManagerはその後継として登場し、自動移行と追加機能(チェーン、実行保証、タグ、LiveDataによる状態監視)を備えたクロスプラットフォームAPIを提供しています。

JobSchedulerからWorkManagerに移行する際は、JobServiceをWorkerに変換し、JobInfoをWorkRequestに、Context.getSystemServiceをWorkManager APIに置き換える必要があります。WorkManagerは互換性の問題を自動的に処理し、手動のJobScheduler実装よりも正しくDoze Modeを処理します。移行手順:1)Workerクラスを作成、2)同じ条件でWorkRequestを構築、3)コードとマニフェストからJobServiceとJobInfoを削除。

ユニークタスクのためのUniqueWork

WorkManagerはExistingWorkPolicyを通じてユニークタスクの概念をサポートしています。指定された名前のタスクが既に存在する場合、ポリシーが動作を決定します:KEEP(新規作成しない)、REPLACE(既存を置き換える)、APPEND(チェーンの最後に追加)、APPEND_OR_REPLACE。UniqueWorkRequestは、重複すべきでないタスク(データベース同期、設定ダウンロード、分析バッチ送信)に便利です。

kotlin
WorkManager.getInstance(context)
    .enqueueUniqueWork(
        "sync_data",
        ExistingWorkPolicy.KEEP,
        syncRequest
    )

進捗と中間結果の処理

CoroutineWorkerはsetProgressメカニズムをサポートしており、中間実行結果を渡すことができます。これは長時間実行される操作(大規模ファイルのダウンロード、画像のバッチ処理、データベース移行)に役立ちます。UIはgetWorkInfosByTagLiveDataを介して更新を購読し、リアルタイムの進捗を表示できます。タスクをユーザーに表示する必要がある場合は、ForegroundInfoメソッドを使用してWorkerを通知付きのForeground Serviceとして実行することもできます。

kotlin
class ProgressWorker(
    context: Context,
    params: WorkerParameters
) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        val total = 100
        for (i in 1..total) {
            setProgress(
                workDataOf("progress" to i)
            )
        }
        return Result.success()
    }
}

データ転送のためのInputDataとOutputData

WorkManagerはInputDataOutputDataを介したWorker間のデータ転送をサポートしています。InputDataはData.Builderを介してWorkRequest構築時に作成され、inputDataを介してWorkerに渡されます。実行後、WorkerはworkDataOfまたはData.Builderを介してOutputDataを作成し、Result.success(outputData)とともに返します。チェーン内の次のWorkerは、前のWorkerのoutputDataを自身のinputDataとして受け取ります。データはキーと値の形式で保存され、基本的な型(String、Int、Long、Boolean、Double)をサポートします。Dataの最大サイズは10 KBです。

実際には、多くのプロジェクトがWorkManagerを唯一のバックグラウンドタスクスケジューラーとして使用しています。Googleは、特にJobSchedulerが利用できずWorkManagerがAlarmManagerとBroadcastReceiverを介してフォールバックメカニズムを使用するAndroid 4.4(API 19)以下をサポートするアプリでは、既存のすべてのJobServiceをWorkManagerに移行することを推奨しています。テストのために、WorkManagerはTestListenableWorkerBuilderとTestWorkerBuilderを提供しており、実際のスケジューラーなしでJUnitテストでWorkerをテストできます。

WorkManagerをテストするには、AndroidX TestのTestListenableWorkerBuilderを使用します。これにより、隔離された環境でWorkerを実行し、返されたResultを確認できます。このライブラリは、実際のスケジューラーなしでの単体テストのための完全なJUnitおよびRobolectricサポートを提供します。全体として、WorkManagerは以前ServiceやJobSchedulerが使用されていたタスクの80%に適しています。

よくある質問

WorkManagerはデバイス再起動後にタスクの実行を保証しますか?

はい、WorkManagerは再起動後も実行を保証します。ライブラリはすべての未完了タスクをRoomデータベースに保存し、システム起動後にトリガーされるBroadcastReceiverを使用して復元します。

Worker、CoroutineWorker、RxWorkerの違いは?

WorkerはcoroutineやRxJavaをサポートせずにバックグラウンドスレッドで実行されます。CoroutineWorkerはKotlin coroutineを使用し、suspend関数とcoroutineスコープによるキャンセルをサポートします。RxWorkerはObservableとSingleで動作し、リアクティブチェーンに適しています。

WorkManagerでタスクをキャンセルするには?

workManager.cancelWorkById(id)またはworkManager.cancelAllWorkByTag("tag")を使用します。ライブラリは指定された名前のユニークタスクをキャンセルするためのcancelUniqueWork("name")メソッドも提供しています。

PeriodicWorkRequestの最小間隔は?

PeriodicWorkRequestの最小間隔は15分です。この制限は、過度のバッテリー消費を防ぐためにGoogleによって設定されています。タスクをより頻繁に実行する必要がある場合は、Foreground Serviceまたはタイマー付きのHandlerを使用してください。

WorkManagerはAndroid 4.4以下をサポートしていますか?

はい、WorkManagerはAPI 14+をサポートしています。JobSchedulerがないデバイス(API 21未満)では、ライブラリはAlarmManagerとBroadcastReceiverの組み合わせを使用してタスクをスケジュールします。これにより、WorkManagerはバックグラウンドタスクのための汎用的なソリューションになります。

まとめ

  • WorkManagerは、すべてのAndroidバージョンで確実に実行されるバックグラウンドタスクのための最新のJetpackライブラリです。
  • 3つの基本クラス — Worker、WorkRequest、WorkManager — がすべてのスケジューリングと実行のシナリオをカバーします。
  • 2つのリクエストタイプ — OneTimeWorkRequestとPeriodicWorkRequest — 1回限りと繰り返しのタスク用。
  • 制約(ネットワーク、バッテリー、ストレージ)は、不利な条件下でのタスク実行を防ぎます。
  • タスクチェーンにより、結果を受け渡しながらWorkerを順次実行できます。
  • CoroutineWorkerとRxWorkerは、coroutineとRxJavaによる非同期プログラミングをサポートします。
  • WorkManagerは、ほとんどのバックグラウンドタスクシナリオでJobScheduler、Service、AlarmManagerを置き換えます。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください