Начиная с Android 8 сервисы, с помощью которых ранее работали фоновые задачи, были сильно урезаны в правах и возможностях.

Сейчас в Android есть инструмент, позволяющий запускать задачи в фоне. Он называется WorkManager.

Чтобы использовать WorkManager, нужно его подключить:

implementation "android.arch.work:work-runtime:1.0.0-beta01"

 

Основные классы:

  • Worker — собственно, сама задача. Нужно расширить этот класс и в методе doWork() описать задачу
  • WorkRequest — задание. Должен содержать, как минимум, класс, расширяющий Worker, но можно досыпать деталей: условия или время выполнения. Имеет уникальный сгенерированный идентификатор, с помощью которого можно, например, отменить задачу. Содержит вспомогательные классы:
    • Builder — вспомогательный класс для построения
    • Constraints — построитель ограничений
  • WorkManager — ставит процессы в очередь и управляет ими. Объект WorkRequest передаётся в WorkManager, чтобы поставить задачу в очередь. WorkManager планирует задачу таким образом, чтобы распределить нагрузку на системные ресурсы, соблюдая при этом указанные ограничения.
  • WorkInfo — содержит информацию о конкретной задаче. WorkManager предоставляет LiveData для каждого объекта WorkRequest. LiveData содержит объект WorkInfo. Наблюдая за этими данными можно определить текущий статус задачи и получить любые возвращенные значения после ее завершения.

Итак, объявление класса:

class MyWorker(context : Context, params : WorkerParameters): Worker(context, params) {

    override fun doWork(): Result {
        // Do something
        return Result.success()

        // (Returning Result.retry() tells WorkManager to try this task again
        // later; Result.failure() says not to try again.)
    }
}

Теперь это можно запустить:

val myWork = OneTimeWorkRequestBuilder<MyWorker>().build()
WorkManager.getInstance().enqueue(myWork)

Создание ограничений:

// Create a Constraints object that defines when the task should run
val myConstraints = Constraints.Builder()
        .setRequiresDeviceIdle(true)
        .setRequiresCharging(true)
        // Many other constraints are available, see the
        // Constraints.Builder reference
        .build()

// ...then create a OneTimeWorkRequest that uses those constraints
val myWork = OneTimeWorkRequestBuilder<MyWorker>()
        .setConstraints(myConstraints)
        .build()

Отмена задачи:

val myWorkId:UUID = myWork.getId()
WorkManager.getInstance().cancelWorkById(myWorkId)

Добавление тегов (каждая задача может иметь их несколько):

val cacheCleanupTask =
        OneTimeWorkRequestBuilder<MyCacheCleanupWorker>()
    .setConstraints(myConstraints)
    .addTag("cleanup")
    .build()

Повторяюшиеся задачи:

val photoCheckBuilder =
        PeriodicWorkRequestBuilder<PhotoCheckWorker>(12, TimeUnit.HOURS)
// ...if you want, you can apply constraints to the builder here...

// Create the actual work object:
val photoCheckWork = photoCheckBuilder.build()
// Then enqueue the recurring task:
WorkManager.getInstance().enqueue(photoCheckWork)

Вот, вкратце, и всё.

Добавить комментарий

Закрыть меню