Предыдущая статья из этой серии:Запуск фоновых задач в Android с помощью WorkManager: часть 1
Ограничение запуска задачи
WorkManager позволяет нам установить ограничение для запуска задачи. Например, рассматриваемой задачей может быть проверка наличия на устройстве интернет-сервиса. Когда вы передаете такую задачу WorkManager.enqueue
, она проверит наличие интернет-соединения. Если соединение есть, то задание запустится. А если нет, то задача будет висеть в статусе ENQUEUED до появления интернета.
Если задача запущена и по какой-то причине пропал интернет, задача будет остановлена и запланирована заново (В ОЧЕРЕДИ).
Давайте посмотрим, какое ограничение мы можем установить.
Например, мы будем использовать такую задачу.
class WorkManager (context: Context, parameters: WorkerParameters) : Worker(context, parameters) {
private val TAG = this.javaClass.simpleName
override fun doWork(): Result {
Log.d(TAG, "doWork: start")
try {
(0 .. 10).forEach {
TimeUnit.SECONDS.sleep(10)
Log.d(TAG, "${it}, isStopped: $isStopped")
if (isStopped)
return Result.failure()
}
} catch (e: InterruptedException) {
e.printStackTrace()
}
Log.d(TAG, "doWork: end")
return Result.success()
}
override fun onStopped() {
super.onStopped()
Log.d(TAG, "onStopped: ")
}
}
Цикл 10 пауз и журнал isStopped
состояния. Если задача была остановлена, то выйти со статусом FAILURE.
Мы также регистрируем onStopped
метод.
В действии приведенный ниже код используется для отслеживания состояния задачи:
WorkManager.getInstance(this)
.getWorkInfoByIdLiveData(workRequest.id)
.observe(this) { workInfo ->
Log.d(TAG, "onChanged: " + workInfo.state)
}
setRequiresCharging (логическое значение требует зарядки)
Ограничение: Зарядное устройство должно быть подключено.
Код для добавления ограничения выглядит так :
val constraints = Constraints.Builder()
.setRequiresCharging(true)
.build()
val workRequest: WorkRequest = OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(constraints)
.build()
В Constraints.Builder
, мы включаем критерий setRequiresCharging, создаем объект Constraints и передаем его OneTimeWorkRequest.Builder
в setConstraints
метод.
setRequiresBatteryNotLow (логическое значение требуетBatteryNotLow)
Ограничение: уровень заряда батареи не ниже критического.
setRequiredNetworkType (сетевой тип сети)
Ограничение: наличие интернета.
Мы можем указать, какой тип интернет-сети (NetworkType) следует использовать при запуске задачи:
ПОДКЛЮЧЕНО – Wi-Fi или мобильные данные НЕ ИЗМЕРЯЮТСЯ – только Wi-Fi ИЗМЕРЯЕТСЯ – только мобильные данные NOT_ROAMING – Интернет не должен находиться в роуминге NOT_REQUIRED – Интернет не требуется
setRequiresDeviceIdle (логическое значение requireDeviceIdle)
Ограничение: устройство некоторое время не использовалось и перешло в спящий режим. Работает на API 23 и выше.
setRequiresStorageNotLow (логическое значение требуетStorageNotLow)
Ограничение: на устройстве должно быть свободное место, не меньше критического порога.
addContentUriTrigger(Uri uri, boolean triggerForDescendants)
Uri
Ограничение: задача будет выполняться при обновлении содержимого указанного . Работает на API 24 и выше.
Для одной задачи можно установить сразу несколько ограничений.