Для чего нужен WorkManager

Ответ

WorkManager — это API для отложенного выполнения фоновых задач, которые должны выполняться гарантированно, даже если приложение закрыто или устройство перезагружается.

Ключевые особенности:

  • Работает на API 14+
  • Учитывает версию Android (использует JobScheduler, AlarmManager или BroadcastReceiver)
  • Поддерживает цепочки задач, ограничения (например, интернет, зарядка)
  • Гарантирует выполнение (переживает перезагрузки)

Пример:

val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
    .setConstraints(
        Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build()
    )
    .build()

WorkManager.getInstance(context).enqueue(uploadWorkRequest)

Идеально для синхронизации данных, логирования, периодических обновлений.

Ответ 18+ 🔞

А, WorkManager, говоришь? Ну это такая штука, чтобы твоё приложение могло что-то делать по расписанию или в фоне, даже когда ты его закрыл или вообще телефон вырубил. Представь, тебе надо данные на сервер отправить, а у пользователя связь говно. Ты ставишь задачу — «отправь, когда интернет появится», и идешь спать. А эта хитрая жопа сама всё сделает, когда условия подходящие. Удобно, блядь.

Что он из себя представляет, этот зверь?

  • Работает на древних телефонах, чуть ли не с Android 4.0. Широкая душа, всем даёт.
  • Сам разбирается, какую систему в телефоне использовать для запуска — по-умному или по-старинке. Твоя задача — сказать ЧТО сделать, а КАК — это уже его головная боль. Доверия к нему, в принципе, много, он не подводит.
  • Может ставить условия: «работай только когда Wi-Fi есть» или «жду, пока на зарядку поставят». Не будет зря батарейку сосать.
  • Главный козырь — гарантия. Даже если пользователь телефон в стенку швырнёт и перезагрузит, WorkManager вспомнит все невыполненные задачи и доведёт их до ума. Не то что некоторые... сам от себя охуеешь, насколько надёжно.

Вот, смотри, как это в коде выглядит, простейший пример:

val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
    .setConstraints(
        Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build()
    )
    .build()

WorkManager.getInstance(context).enqueue(uploadWorkRequest)

Объясняю: ты создаёшь запрос на одну работу (OneTimeWorkRequest). Говоришь: «Э, дружок-пирожок, запускай мой UploadWorker, но только когда интернет есть, а то без толку». Потом суёшь этот запрос в менеджер, и всё — да похуй, можно забыть. Он своё дело сделает.

Идеально, ёпта, для всякой рутины: синхронизировать данные раз в день, логи куда-то слать, картинки заранее качать. В общем, для всего, что должно случиться точно, но не прямо сейчас. Пизда рулю, а не библиотека.