---
# System prepended metadata

title: WorkManager

---

# WorkManager

## GDE
Google Developers Experts
https://developers.google.com/community/experts/
簡単になれる（は？）ので登録！！

## WorkManager
バックグラウンドタスクの実装
API Levelによる処理の分岐が必要だった．
バッテリ効率かのためにDozeが入ったりとか，それでもバックグランドタスクの動きは保証しなければならない
→WorkManger使おう！

API 14以降なら全部使える

ただし，実行タイミングは厳密じゃなくてもよいが，かならず実行したいタスクの実行に使えるよ！


### 注意！
データストア代わりに使用しない．
- データのインスタンスは10KBまでしかない
表示中のアプリのView更新とかでは使わない！

### 使い所
https://www.youtube.com/watch?v=pe_yqM16hPQ

https://developer.android.com/guide/background

## 実際の書き方
- Worker
    - バックグラウンドで実際に実行する処理を書く
    - バックグランドで実行させたいコードを`onWrok`に書く
- WorkRequest
    - OneTimeWorkRequest
    - PeriodWorkRequest
    - これらのリクエストをworkManagerにenqueueすると実行される
- Constraints
    - 発火の条件もつけられる！！！
    - setConstraintsするだけ
    - ネットワークとかバッテリ残量とかいろいろある
- Backoff Policy
    - リトライ時の再試行のポリシー
    - だんだん長くなるのと指定した時間だけリニアにするものがある
    - setBackOffPolicyするだけ
- IDとTag
    - UUID形式のIDが自動的に割り振られる！！！
        - `someWork.id`で取得できる
    - 開発者がTagを割り振ることもできる．
        - このTagを使ってLiveDataを作ることも可能．
- WorkInfo
    - LiveDataとして取り出すことも可能．

## Workerのスレッド
AsyncTaskのThreadPoolExecutorと同じ設定．Fixedなスレッドプールを持つExecutorが用いられる．
初期化時にExecutorをカスタマイズすることも可能

## Chain
スケジューリング時に複数のWorkerをつなげることができる．
実態はWorkContinuation，
workManager.beginWith()で初めて，then()でつなげる．Promiseみたいだね
beginWith()はlistを引数として取ることも可能！！！

## InputMerger
複数の入力タスクの結果を1つのデータにマージすることもできる！！！
OverwritingInputMergerとか
同じキーのものはあとから来たもので上書きするなど
少し構造が違っても，いい感じに足してくれる
ArrayCreatingInputManagerとか言っていい感じにArrayに足してくれるやつもある

## Unique Work
Chainに対して名前をつけ，常に同盟のものは一回しか動作しないようにする
これはChainに対して名前を付けるもの，Tagは一つのWorkRequestにつけるもの！

## キャンセル
キャンセルもできるぞ！

## 再起動しても動く
アプリ再起動しても途中から動いてくれる→ただし，Tagの名前とかは統一しておかないと死ぬ
中華系だと再起動しない端末もあったりする（しぼう）
10分を超えると止まってしまう，レスポンスも帰ってこない