Запуск фоновых задач в Android с помощью WorkManager: часть 2
21 апреля 2023 г.Предыдущая статья из этой серии: Выполнение фоновых задач в Android с WorkManager: часть 1
Ограничение запуска задачи
WorkManager позволяет нам установить ограничение для запуска задачи. Например, рассматриваемой задачей может быть проверка наличия на устройстве интернет-сервиса. Когда вы передаете такую задачу WorkManager.enqueue
, она проверяет наличие подключения к Интернету. Если соединение есть, то задание запустится. А если его нет, то задача будет висеть в статусе ЗАЧИСЛЕНА до появления интернета.
Если задача запущена и по какой-то причине пропал Интернет, задача будет остановлена и запланирована заново (В ОЧЕРЕДИ).
Давайте посмотрим, какое ограничение мы можем установить.
Например, мы будем использовать такую задачу.
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 (логическое значение requireCharging)
Ограничение: зарядное устройство должно быть подключено.
Код для добавления ограничения выглядит следующим образом:
val constraints = Constraints.Builder()
.setRequiresCharging(true)
.build()
val workRequest: WorkRequest = OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(constraints)
.build()
В Constraints.Builder
мы включаем критерий setRequiresCharging, создаем объект Constraints и передаем его в OneTimeWorkRequest.Builder
в методе setConstraints
. р>
setRequiresBatteryNotLow (логическое значение requiredBatteryNotLow)
Ограничение: уровень заряда батареи не ниже критического.
setRequiredNetworkType(NetworkType networkType)
Ограничение: наличие Интернета.
Мы можем указать, какой тип интернет-сети (NetworkType) следует использовать при запуске задачи:
ПОДКЛЮЧЕНО – Wi-Fi или мобильные данные БЕЗ ИЗМЕРЕНИЯ – только Wi-Fi METERED – только мобильные данные NOT_ROAMING - Интернет не должен быть в роуминге NOT_REQUIRED - Интернет не требуется
setRequiresDeviceIdle (логическое значение requireDeviceIdle)
Ограничение: устройство некоторое время не использовалось и перешло в спящий режим. Работает с API 23 и выше.
setRequiresStorageNotLow (логическое значение требуетStorageNotLow)
Ограничение: на устройстве должно быть свободное место, не меньше критического порога.
addContentUriTrigger(Uri uri, логический триггерForDescendants)
Ограничение: задача будет выполняться при обновлении содержимого указанного Uri
. Работает с API 24 и выше.
Для одной задачи можно установить сразу несколько ограничений.
Оригинал