WorkManager の概要
Google は WorkManager コンポーネントをリリースしました。WorkManager は、定期的な実行が必要な一部のタスクの処理に非常に適しています。オペレーティング システムのバージョンに応じて、最下層を AlarmManager で実装するか JobScheduler で実装するかを自動的に選択できるため、使用コストが削減されます。さらに、定期タスク、チェーンタスク処理などの機能もサポートしており、非常に強力なツールです。
WorkManagerの基本的な使い方
app/build.gradle ファイルに依存関係を追加します。
implementation "androidx.work:work-runtime:2.7.1"
WorkManager の基本的な使い方は実際には非常に簡単で、主に次の 3 つのステップに分かれています。
- バックグラウンド タスクを定義し、特定のタスク ロジックを実装します。
- バックグラウンドタスクの実行条件や制約情報を設定し、バックグラウンドタスクリクエストを作成します。
- バックグラウンド タスクのリクエストを WorkManager の enqueue() メソッドに渡すと、システムが適切な時間に実行されます。
最初のステップはバックグラウンド タスクを定義することです。ここでは SimpleWorker クラスを作成します。コードは次のとおりです。
class SimpleWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
Log.d("SimpleWorker", "do work in SimpleWorker")
return Result.success()
}
}
2 番目のステップは、バックグラウンド タスクの実行条件と制約情報を構成することです。コードは次のとおりです。
//设置约束条件
//NetworkType.CONNECTED 最通用的连上网络
//NetworkType.UNMETERED WF
//NetworkType.METERED 流量,4G
val constraints: Constraints =Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
.setConstraints(constraints)
.build()
最後のステップは、構築されたバックグラウンド タスク リクエストを WorkManager の enqueue() メソッドに渡すことで、システムは適切な時間に実行されます。コードは次のとおりです。
WorkManager.getInstance(context).enqueue(request)
WorkManager で複雑なタスクを処理する
(1) 指定した遅延時間後にバックグラウンド タスクを実行します。
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
.setInitialDelay(5,TimeUnit.MINUTES)
.build()
(2) バックグラウンドタスクリクエストにタグを追加する
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
...
.addTag("simple")
.build()
(3) ラベル経由でバックグラウンドタスクリクエストをキャンセルします。
WorkManager.getInstance(this).cancelAllWorkByTag("simple")
(4) ラベルがなくてもIDでバックグラウンドタスクリクエストをキャンセル可能
WorkManager.getInstance(this).cancelAllWorkById(request.id)
(5) すべてのバックグラウンドタスクリクエストを一度にキャンセルします
WorkManager.getInstance(this).cancelAllWork()
(6) バックグラウンドタスクの doWork() メソッドで Result.retry() が返された場合、setBackoffCriteria() メソッドと組み合わせてタスクを再実行できます。
setBackoffCriteria(): 最初のパラメータは、タスクが再び実行に失敗した場合に次の再試行時間をどのように遅らせるかを指定するために使用されます。オプションの値は 2 つあります: 1. LINEAR: 次回の再試行時間が線形的に遅延されることを意味します。2. EXPONENTIAL。次の再試行時間が指数関数的に遅れることを意味します。2 番目のパラメータと 3 番目のパラメータは、タスクを再実行する時間を指定するために使用され、最小時間を 10 秒未満にすることはできません。
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
...
.setBackoffCriteria(BackoffPolicy.LINEAR,10,TimeUnit.SECONDS)
.build()
(7) doWork メソッドで Result.success() と Result.failure() を返すことの影響は何ですか? これら 2 つの戻り値は、実際にはタスクの実行結果を通知するために使用され、次のコードを使用してバックグラウンド タスクの実行結果を監視できます。
WorkManager.getInstance(this).getWorkInfoByIdLiveData(request.id).observer(this){workInfo->
if(workInfo.state==WorkInfo.State.SUCCEEDED){
Log.d("MainActivity","do work succeeded")
}else if(workInfo.state==WorkInfo.State.FAILED){
Log.d("MainActivity","do work failed")
}
}
チェーンタスク
ここで、データの同期、データの圧縮、データのアップロードという 3 つの独立したバックグラウンド タスクが定義されているとします。ここで、最初に同期し、次に圧縮し、最後にアップロードする機能を実現したいと考えています。チェーン タスクを使用してこれを実現できます。
val sync=...
val compress=...
val upload=...
WorkManager.getInstance(this)
.beginWith(sync)
.then(compress)
.then(upload)
.enqueue()