JetpackのWorkManagerのメモです。
WorkManagerとは
- Jetpackのコンポーネントで、スケジュールタスクのようなものを実行する
- 即時性は求めないがアプリが終了した、端末が再起動した場合でも実行したい場合に使用する
- 同様なことを実現するコンポーネントとしてAndroidにはJobSchedulerなどがある
- 端末によってJobSchedulerとAlermManager + BroadcastRecivierなどを使って対応する
- WorkManagerのminSdkVersionは14で特にAPIレベルに依存しないコードがかける
- 一回きりの実行の他にCrontabのように定期間隔で実行することもできる
- 実行時に例えばネットワークに接続できること制約を設定することができる
- タスクをチェインさせることができる
- タスクにはパラメーターを設定することができ実行時に取得できる(インテントのようなもの?)
- ただしデータサイズ上限があるので注意すること(10KB)
- RxJavaを使う場合コンポーネントを追加することで対応できる(RxWorker)
データベース
- WorkManagerはアプリ内に専用のデータベースを作成しタスクなどの情報を管理している
- タスクには一意のUUIDが割り当てられる
- タスクはWorkSpecというテーブルに情報が格納される
- 終了済みのタスクは一定期間後に削除される
- タスク作成時に最低保存期間を指定することもできる
使ってみた感想
- 一回きり実行の場合必ず遅延されるのではなく条件を満たせば実行される
- 制約を満たさない場合はタスクの起動自体が行われない
- WorkManager 2.1.0からJava8が要求される
- APIレベルによって分岐があり、コンポーネントの重ね技など色々考慮しなければならないところをWorkManagerが見てくれるのは想像以上に安心感がある
- RxJavaを使っている場合はRxWorkerを使うと楽。キャンセル時にDisposeもしてくれるみたい
参考サイト
- WorkManager
- WorkManagerを導入するなら読んでおいたほうがよいです
- Android Developers WorkManager
- 公式ドキュメント。意外に手厚く書かれている印象です
- 実践 WorkManager
- 実導入での注意点などが記載されています。ありがたいです。
実際プロダクションでも導入しています。
自分たちが使ったのは、特定の状態になった時にAPIにアクセスするというものです。
この時にネットワークが切断されていたり、サーバーの状態によってアクセスが失敗することがありました。
あの手この手でリトライをしていたのですが、それでもアプリを終了させたときの対応まではしていませんでした。
この処理をWorkManagerで行うことにしました。非常にうまく機能してくれています。
JetPackがすごい充実していることを実感できました。