Android Developers Blog 適当意訳 #6 Android Jetpack WorkManager Stable Release

Android Developers Blog 適当意訳 #6 Android Jetpack WorkManager Stable Release

# Android Jetpack WorkManager が正式版としてリリースされました
2019年3月5日

[原文](https://android-developers.googleblog.com/2019/03/android-jetpack-workmanager-stable.html)
**※英語の勉強と自分用のメモ程度のかなり適当なものです。**


### WorkManager でバックグラウンドタスクをシンプルにしましょう

本日、我々は [Android Jetpack WorkManager 1.0](https://developer.android.com/topic/libraries/architecture/workmanager) の公開をお知らせ出来る事を嬉しく思います。
我々は、ここに到るまでに開発コミュニティにおいてフィードバックやバグ報告をしてくれた多くの方に感謝したいと思います。あなた方のおかげでここまで来られました。

開発者が直面している1番の問題を確認してみると、バックグラウンドプロセスをバッテリーに負荷をかけずに信頼出来るものにする事でした。

これは最新のデータ取得や、ログのアップロードなどを定期的に行う事は複雑だという事を意味しています。
異なるバージョンのAndroidはこれらの仕事をこなす為の異なるツール(しかもそれぞれに癖のある)を提供していました。
例えば、通信環境やストレージの利用可能状況の監視や、自動的にタスクを再実行する事などは多くの作業を必要とします。

WorkManager がこれらの課題に対する我々の答えです。
Google [I/O 2018](https://www.youtube.com/watch?v=IrKoBFLwTN0) で我々は、[Android Jetpack WorkManager library](https://developer.android.com/topic/libraries/architecture/workmanager) のプレビュー版を紹介しました。
そしれそれ以降もあなた方の助けのおかげで機能追加やバグの修正などを行って来ました。

WorkManager の目標は、バックグラウンド処理を容易にする事です。
WorkManager は、バッテリー状況、ストレージもしくは通信の使用可能状況などの制約を考慮し、適切な状況を満たしている時のみ実行します。
さらに、いつ再実行もしくはリスケジュールすべきかを端末、アプリを再起動した場合でも把握しています。


WorkManager は Android開発のもっとも複雑な箇所の一つを容易にしてくれる使いやすいAPIなので、開発者は自分のアプリを素晴らしいものにする為の開発に集中できると我々は信じています。

### WorkManager のハイライト

下記は WorkManager の重要な機能です：

- タスクが実行される為の通信や充電などの条件を指定出来ます
- タスクの同期/非同期実行や定期実行をサポートします
- タスクのデータの入出力を伴う連続実行をサポートします
- アプリや端末の再起動時にもタスク実行を保証します
- Android 4.0+ (API 14+)以上で動作します

[ビデオ](https://youtu.be/pe_yqM16hPQ)をご覧いただき、下記のいつ使うか、どのように使うかをお読みください。


### いつ WorkManager を使うか

WorkManager は今すぐ実行しなくてもいいが、アプリや端末が再起動したとしても実行したいタスク(例えばデータの定期的なバックグラウンドでの同期やログや解析データのアップロードなど)に適しています。
今すぐに送る事が要求されるインスタントメッセージや、アプリの終了後にも実行を求められようなタスクではない場合は、[background processing guide](https://developer.android.com/guide/background/) を見てどの解決策があなたの要求に適しているかを把握してください。

### どのように WorkManager を使うか

WorkManager API を始めるために、アプリケーションの build.gradle に WorkManager 関連の記述を追記してください。

```
dependencies {
    def work_version = 1.0.0

    // Java
    implementation "android.arch.work:work-runtime:$work_version"

    // Kotlin KTX + coroutines
    implementation "android.arch.work:work-runtime-ktx:$work_version"
}
```

[Worker](https://developer.android.com/reference/androidx/work/Worker) のサブクラスを作成し、doWork()メソッドをオーバーライドし、バックグラウンドで実行する処理を記述し、それを WorkManager に登録します。

```
class MyWorker(ctx: Context, params: WorkerParameters)
  : Worker(ctx, params) {
  override fun doWork(): Result {
    //do the work you want done in the background here
    return Result.success()
  }
}

// optionally, add constraints like power, network availability
val constraints: Constraints = Constraints.Builder()
     .setRequiresCharging(true)
                .setRequiredNetworkType(NetworkType.CONNECTED)
                .build()

val myWork = OneTimeWorkRequestBuilder()
                .setConstraints(constraints).build()
```

これで WorkManager は、端末が通信可能で充電中の時にタスクを実行するようになりました。

### なぜ WorkManager を使うのか

**後方互換性**

WorkManager は Android 6.0+ (API 23+)以上の環境では、 JobScheduler を使い、それ未満のバージョンでは、 AlarmManager と BroadcastReceiver を組み合わせて使っています。
Androidの新しいバージョンで、バッテリーを最大限維持しアプリの正しい振る舞いを行う為に紹介されたシステムの最適化に従うべく努力しています。
例えば、WorkManager はバックグラウンド処理を Android 6.0+ (API 23+)の端末が Doze mode の時は、maintenance window の間に実行するようにスケジュールします。

**信頼できるスケジューリング**

WorkManager で、あなたは楽にネットワークの状態や充電の状態のような制約を追加出来ます。
あなたのタスクは制約条件に一致した時に実行され、実行中に仮に失敗した場合は自動で再度実行されます。
例えば、もしあなたのタスクが通信環境を必要としているなら、タスクはネットワークが使えなくなった時には停止し、後で再度実行されるでしょう。

あなたは [LiveData](https://developer.android.com/topic/libraries/architecture/livedata) を使う事で、タスクの状態を監視し、結果を取得する事も可能です。
これは、UIにタスク完了時の通知を可能にします。
タスクの失敗時の振る舞いもコントロール可能です。[backoff](https://developer.android.com/reference/androidx/work/BackoffPolicy) の設定によって、どのようにタスクを再実行させるかをコントロール出来ます。
WorkManager は端末、アプリの再起動時に、ローカルデータベースに保存されているタスクの実行記録を使ってタスクをリスケジュール出来ます。

**タスクの柔軟なコントロール**

我々は、アプリにはそれぞれ独自の要件があることを理解しています。
WorkManager あなたのタスクの設計や実行を助けるシンプルでかつとても柔軟なAPIです。

[OneTimeWorkRequest](https://developer.android.com/reference/androidx/work/OneTimeWorkRequest.html) を使う事で一度きりのタスク実行、[PeriodicWorkRequest](https://developer.android.com/reference/androidx/work/PeriodicWorkRequest) を使う事で定期的なタスク実行のメリットを得る事が出来ます。

あなたはタスクを並列もしくは順番に実行する為にタスクをまとめる事も可能です。
もし、まとめられたタスクのどれかが失敗したら、 WorkManager は残りのタスクを実行しないようにします。
まとめられたタスクの実行は[ここ](https://developer.android.com/topic/libraries/architecture/workmanager/how-to/chain-work.md)をご覧ください。
もし、あなたのタスクの要件が WorkManager が出来る事より複雑な場合は、[advanced threading guide](https://developer.android.com/topic/libraries/architecture/workmanager/advanced/threading.md) をご確認ください。

### WorkManager を始めてみよう

[getting started guide](https://developer.android.com/topic/libraries/architecture/workmanager/basics) を確認して、実際に WorkManager 使う為に [codelab](https://codelabs.developers.google.com/codelabs/android-workmanager-kt/#0) を試してみてください。
あなたのお気に入りの機能や、必要な機能などのフィードバックをいただけると嬉しいです。
バグを発見した場合は遠慮なく、[お知らせください。](https://issuetracker.google.com/issues/new?component=409906&template=1094197)