WorkManagerとバックグラウンドタスク
WorkManagerで確実に実行されるバックグラウンド処理をスケジュールします。OneTimeWorkRequest、PeriodicWorkRequest、制約、データ受け渡し、ワークの連結を使います。
「WorkManagerとバックグラウンドタスク」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン5/6です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全6レッスンが含まれています。
Androidのバックグラウンド処理
Androidはバッテリーを節約するため、バックグラウンド処理を厳しく制限します。WorkManagerが登場する前は、開発者は次の機能を使用していました。
- AsyncTask(非推奨)
- AlarmManager(再起動やDozeの影響を受け、信頼性が低い)
- JobScheduler(APIが複雑)
- Service(終了される可能性があり、再試行にも対応していない)
WorkManagerは、遅延可能で確実に実行する必要があるバックグラウンド処理に推奨されるソリューションです。
WorkManagerとは
WorkManagerを使うと、アプリが終了した場合やデバイスが再起動した場合でも、処理が実行されることを保証できます。次の機能があります。
- 再起動後も処理を保持する
- 失敗時に自動的に再試行する
- 制約(Wi-Fi接続時のみ、充電中のみなど)に対応する
- API 14以降で動作する
CoroutineWorkerを通じてKotlin Coroutinesと統合できる
セットアップ
app/build.gradleにWorkManagerを追加します。
dependencies {
implementation 'androidx.work:work-runtime-ktx:2.9.0'
}Workerの作成
CoroutineWorkerを継承し、doWork()を実装します。Result.success()、Result.failure()、またはResult.retry()を返します。
class SyncWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return try {
// This runs on a background coroutine
val repo = UserRepository(applicationContext)
repo.syncFromNetwork()
Result.success()
} catch (e: Exception) {
if (runAttemptCount < 3) Result.retry()
else Result.failure()
}
}
}OneTimeWorkRequest
1回だけ実行するタスクをスケジュールし、キューに追加します。
val syncWork = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(10, TimeUnit.MINUTES) // optional delay
.build()
WorkManager.getInstance(context).enqueue(syncWork)
// With a unique name (prevents duplicates):
WorkManager.getInstance(context).enqueueUniqueWork(
"sync_work",
ExistingWorkPolicy.KEEP, // don't enqueue if already pending
syncWork
)PeriodicWorkRequest
繰り返し実行するタスクをスケジュールします。最小間隔は15分です。
val periodicSync = PeriodicWorkRequestBuilder<SyncWorker>(
repeatInterval = 1, TimeUnit.HOURS
).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
"hourly_sync",
ExistingPeriodicWorkPolicy.KEEP,
periodicSync
)制約
バッテリー残量が十分、Wi-Fiに接続中など、条件を満たしている場合にのみ処理を実行します。
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED) // WiFi only
.setRequiresBatteryNotLow(true)
.setRequiresCharging(false)
.build()
val work = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(constraints)
.build()
WorkManager.getInstance(context).enqueue(work)入出力データ
Dataオブジェクトを使用して、Workerとの間でデータを受け渡します。
// Enqueue with input data:
val inputData = workDataOf("user_id" to 42)
val work = OneTimeWorkRequestBuilder<SyncWorker>()
.setInputData(inputData)
.build()
// Inside the Worker:
class SyncWorker(...) : CoroutineWorker(...) {
override suspend fun doWork(): Result {
val userId = inputData.getInt("user_id", -1)
// Pass output data back:
val output = workDataOf("synced_count" to 10)
return Result.success(output)
}
}処理状態の監視
getWorkInfoByIdLiveDataを使用して、処理の進捗を監視します。
val workRequest = OneTimeWorkRequestBuilder<SyncWorker>().build()
WorkManager.getInstance(this).enqueue(workRequest)
WorkManager.getInstance(this)
.getWorkInfoByIdLiveData(workRequest.id)
.observe(this) { info ->
when (info?.state) {
WorkInfo.State.RUNNING -> binding.tvStatus.text = "Syncing..."
WorkInfo.State.SUCCEEDED -> binding.tvStatus.text = "Done!"
WorkInfo.State.FAILED -> binding.tvStatus.text = "Failed"
else -> {}
}
}処理のチェーン化
処理チェーンを使用して、タスクを順番に、または並列に実行します。
val downloadWork = OneTimeWorkRequestBuilder<DownloadWorker>().build()
val processWork = OneTimeWorkRequestBuilder<ProcessWorker>().build()
val uploadWork = OneTimeWorkRequestBuilder<UploadWorker>().build()
// Sequential: download → process → upload
WorkManager.getInstance(context)
.beginWith(downloadWork)
.then(processWork)
.then(uploadWork)
.enqueue()
// Parallel then merge:
WorkManager.getInstance(context)
.beginWith(listOf(downloadWork, processWork)) // both run in parallel
.then(uploadWork) // runs after both finish
.enqueue()WorkManagerと代替手段の比較
用途に応じた使い分け:
- WorkManager — 遅延可能で確実に実行し、制約を設定できる処理。同期、アップロード、クリーンアップに最適です。
- Coroutines / ViewModel — アプリが開いている間だけ行う処理。アプリが終了すると停止します。
- AlarmManager — 指定時刻に正確に実行するアラーム(カレンダーのリマインダーなど)。バッテリーへの影響に注意が必要です。
- Foreground Service — ユーザーが認識している長時間処理(音楽再生、ナビゲーションなど)。
理解度チェック
PeriodicWorkRequestの繰り返し間隔の最小値はどれくらいですか。
まとめ:WorkManager
WorkManagerは、バックグラウンド処理を確実に実行するための適切なツールです。
CoroutineWorkerを継承し、doWork()を実装するResult.success()、.failure()、または.retry()を返す- 1回だけ実行する場合は
OneTimeWorkRequest、繰り返し実行する場合はPeriodicWorkRequestを使用する - Wi-Fiのみ、バッテリー状態などの条件には
Constraintsを追加する workDataOf()でデータを渡すbeginWith().then().enqueue()でタスクをチェーン化する
次は、美しいUIを実現するMaterial Designコンポーネントについて学びます。
よくある質問
「WorkManagerとバックグラウンドタスク」レッスンは無料ですか?
はい。「WorkManagerとバックグラウンドタスク」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全6レッスンが含まれています。
「WorkManagerとバックグラウンドタスク」で何を学びますか?
WorkManagerで確実に実行されるバックグラウンド処理をスケジュールします。OneTimeWorkRequest、PeriodicWorkRequest、制約、データ受け渡し、ワークの連結を使います。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Android Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン5/6です。
「WorkManagerとバックグラウンドタスク」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAndroid Academyレッスンでコードを書いて実行できますか?
はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- RetrofitとREST API
- Coilによる画像読み込み
- エラー処理とUX
- プッシュ通知
- WorkManagerとバックグラウンドタスク
- Play Storeへの公開