WorkManagerは、遅延タスクおよびバックグラウンドタスクを確実に実行するためのAndroid Jetpackライブラリです。ServiceやJobSchedulerとは異なり、WorkManagerはタスクのライフサイクルを管理します。障害時には再起動し、Androidバージョンに適応し、デバイスの制約を考慮します。Android Developers, 2026によると、WorkManagerは最新のAndroid開発におけるほとんどのバックグラウンド操作に推奨されるソリューションです。
重要なポイント
WorkManagerはAndroid Jetpackの一部であり、アプリがフォアグラウンドにあるかユーザーによって閉じられたかに関係なく、確実に実行されるバックグラウンドタスクを管理するためのライブラリです。このライブラリはAPI 14+をサポートし、適切な実行メカニズムを自動的に選択します:Android 5+ではJobScheduler、古いバージョンではBroadcastReceiver + AlarmManager。
WorkManagerの主な機能は確実な実行です。デバイスの再起動、アプリの終了、またはクラッシュによりタスクが完了しなかった場合、WorkManagerは最初の機会に再起動します。これにより、ライブラリは実行が重要なタスク(分析情報の送信、データベース同期、ログのアップロード)に理想的な選択肢となります。
Background Serviceとは異なり、WorkManagerはスレッドとライフサイクルの管理を必要としません。ライブラリ自体がスレッドプールを作成し、Doze Modeを処理し、Androidバージョンを考慮し、APIレベルに関係なく統一されたAPIを提供します。CoroutineおよびRxJavaのサポートは、それぞれCoroutineWorkerおよびRxWorkerを介して利用できます。
WorkManagerは、タスクの状態を追跡するための組み込みのLiveDataサポートを提供します。getWorkInfoByIdLiveDataメソッドはLiveData<WorkInfo>を返し、ENQUEUED、RUNNING、SUCCEEDED、FAILED、CANCELLEDの各状態変更時に更新されます。これにより、UIコンポーネントはLifecycle-awareコンポーネントのおかげで、スケジューラーを手動でポーリングしたりメモリリークを発生させたりすることなく、変更に反応できます。
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のアーキテクチャは、Worker、WorkRequest、WorkManagerの3つの基本クラスを中心に構築されています。Workerはタスクロジックを含み、WorkRequestは実行パラメーターを記述し、WorkManagerはキューとスケジューリングを管理します。ライブラリは内部のRoomデータベースを使用してすべてのタスクの状態を保存します。
Workerは抽象クラスで、バックグラウンドスレッドで呼び出される単一のメソッドdoWorkを持ちます。このメソッドはListenableWorker.Result — SUCCESS、FAILURE、またはRETRYを返します。WorkRequestはWorkerをパラメーター(タイムアウト、タグ、初期遅延、制約)に結び付けます。
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は、Androidバージョンに関係なくタスクを均一にスケジュールします。enqueueを呼び出すと、ライブラリはタスクをRoomに保存し、現在の条件を評価し、最適な実行時間を選択します。内部的には、JobScheduler、AlarmManager、または独自のスケジューラーを使用する場合があり、開発者はそのことを心配する必要はありません。
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(15, TimeUnit.MINUTES)
.addTag("sync")
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
WorkManagerは、1回限りと定期限の2種類の実行リクエストをサポートしています。タイプの選択はシナリオに依存します:タスクを1回実行するか、指定された間隔で繰り返すか。
OneTimeWorkRequestは、1回だけ実行する必要があるタスク向けに設計されています。ログの送信、認証後のデータ同期、初回起動時の設定ダウンロードなどが該当します。遅延はsetInitialDelay、制約はsetConstraintsで設定します。
PeriodicWorkRequestは、最小間隔15分の繰り返しタスクに適しています。ライブラリは、実行間隔が指定された間隔より短くならないことを保証しますが、デバイスの制約により長くなる可能性があります。15分未満の頻度のタスクには、Foreground ServiceでHandlerまたはTimerを使用してください。
| パラメーター | OneTimeWorkRequest | PeriodicWorkRequest |
|---|---|---|
| 頻度 | 1回限り | 繰り返し(最小15分) |
| 回数 | 1回の実行 | キャンセルまで |
| 遅延 | setInitialDelay | setInitialDelay |
| チェーン | 対応 | 不可 |
| 使用例 | ダウンロード、同期 | 監視、ポーリング |
WorkManagerの制約により、タスクを開始できる条件を設定できます:ネットワーク接続(NetworkType)、バッテリーレベル(batteryNotLow)、ストレージ状態(StorageNotLow)、アイドルモード(DeviceIdle)。すべての制約が満たされるまでタスクは開始されません。
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))を使用します。
WorkManager.getInstance(context)
.beginWith(compressWorker)
.then(uploadWorker)
.then(cleanupWorker)
.enqueue()
// compress -> upload -> cleanup 順次実行
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を削除。
WorkManagerはExistingWorkPolicyを通じてユニークタスクの概念をサポートしています。指定された名前のタスクが既に存在する場合、ポリシーが動作を決定します:KEEP(新規作成しない)、REPLACE(既存を置き換える)、APPEND(チェーンの最後に追加)、APPEND_OR_REPLACE。UniqueWorkRequestは、重複すべきでないタスク(データベース同期、設定ダウンロード、分析バッチ送信)に便利です。
WorkManager.getInstance(context)
.enqueueUniqueWork(
"sync_data",
ExistingWorkPolicy.KEEP,
syncRequest
)
CoroutineWorkerはsetProgressメカニズムをサポートしており、中間実行結果を渡すことができます。これは長時間実行される操作(大規模ファイルのダウンロード、画像のバッチ処理、データベース移行)に役立ちます。UIはgetWorkInfosByTagLiveDataを介して更新を購読し、リアルタイムの進捗を表示できます。タスクをユーザーに表示する必要がある場合は、ForegroundInfoメソッドを使用してWorkerを通知付きのForeground Serviceとして実行することもできます。
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()
}
}
WorkManagerはInputDataとOutputDataを介した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は再起動後も実行を保証します。ライブラリはすべての未完了タスクをRoomデータベースに保存し、システム起動後にトリガーされるBroadcastReceiverを使用して復元します。
WorkerはcoroutineやRxJavaをサポートせずにバックグラウンドスレッドで実行されます。CoroutineWorkerはKotlin coroutineを使用し、suspend関数とcoroutineスコープによるキャンセルをサポートします。RxWorkerはObservableとSingleで動作し、リアクティブチェーンに適しています。
workManager.cancelWorkById(id)またはworkManager.cancelAllWorkByTag("tag")を使用します。ライブラリは指定された名前のユニークタスクをキャンセルするためのcancelUniqueWork("name")メソッドも提供しています。
PeriodicWorkRequestの最小間隔は15分です。この制限は、過度のバッテリー消費を防ぐためにGoogleによって設定されています。タスクをより頻繁に実行する必要がある場合は、Foreground Serviceまたはタイマー付きのHandlerを使用してください。
はい、WorkManagerはAPI 14+をサポートしています。JobSchedulerがないデバイス(API 21未満)では、ライブラリはAlarmManagerとBroadcastReceiverの組み合わせを使用してタスクをスケジュールします。これにより、WorkManagerはバックグラウンドタスクのための汎用的なソリューションになります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。