はじめに
少し前の話ですが、Android12からフォアグラウンドサービスの起動に関する制限が入り、本格的にWorkManagerへの移行を余儀なくされましたね。
公式でも代替策としてWorkManagerの使用を提示していました。
また、現時点で正しく上記に対応できていないと、ForegroundServiceStartNotAllowedExceptionにより見事にクラッシュしてしまう最悪の結果を招くことになります。
今後は特別な理由がない限りWorkManagerを優先して使用すべきだと思いますが、このWorkerの実装はプロジェクトの性質によってはそれなりに使用頻度が多く、毎度実装方法を確認するのも手間なので、今回はコピペで使えるテンプレートを記事としてまとめておこうと思います。
WorkManager実装テンプレート
テンプレートは一度きりの起動と、繰り返し起動の設定2種とWorker側の基本的な実装をおいておくことにします。
まず、一度きり起動する場合の起動時の設定をテンプレートとして記述します。
main.kt
// TODO 起動条件を個々に合わせて設定します。
val constraint = Constraints
.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
// TODO delayは必要であれば設定します、必要なければ内部で初期値0で定義されているので設定は不要です。
val request = OneTimeWorkRequestBuilder<TestWorker>()
.setInitialDelay(duration = 10, timeUnit = TimeUnit.MINUTES)
.addTag(TestWorker::class.java.name)
.setConstraints(constraint)
.build()
WorkManager.getInstance(context)
.enqueueUniqueWork("Test", ExistingWorkPolicy.REPLACE, request)
次に繰り返し起動させたい場合の設定になります。
main.kt
// TODO 起動条件を個々に合わせて設定します。
val constraint = Constraints
.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
/**
* TODO インターバルとフレックスタイムに適切な値を設定します。
* 最小はそれぞれインターバルが15分、フレックスタイムが5分です。
* 注意点として、フレックスタイムは任意のパラメータですが、設定しないとインターバル時刻がフレックスタイムとして使用され、
* 想定した通りの動作にならない可能性があります。
* Worker自体ピンポイントで動作するというのが難しい性質を持っていますが、なるべく適した時間に処理を行いたい場合は、
* フレックスタイムに最小時刻を設定してあげれば良いと思います。
*/
val request = PeriodicWorkRequestBuilder<TestWorker>(
repeatInterval = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
repeatIntervalTimeUnit = TimeUnit.MINUTES,
flexTimeInterval = PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS,
flexTimeIntervalUnit = TimeUnit.MINUTES)
.addTag(TestWorker::class.java.name)
.setConstraints(constraint)
.build()
WorkManager.getInstance(context)
.enqueueUniquePeriodicWork("Test", ExistingPeriodicWorkPolicy.UPDATE, request)
最後にWorker側の基本的な実装です。
TestWorker.kt
class TestWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
override fun doWork(): Result {
return Result.success()
}
}
テンプレートは以上です、上記に足りない部分に関しては各プロジェクトに合わせて調整を行うようにしてもらえたらと思います。
また、WorkManagerは少し複雑な仕様の上で動作しているので、上記テンプレートの設定やその他不明点等あれば、以下の公式ドキュメントを参照いただければと思います。
# さいごに
少しでも実装時に楽ができるように、テンプレート記事増やしていきたいですね。