Android.WorkManager работает, когда приложение закрыто? - PullRequest
0 голосов
/ 04 июня 2018

Я хочу запланировать ночные обновления базы данных.Поэтому я использую новый Android WorkManager.Насколько я понимаю, после запланированного запуска он всегда будет работать в фоновом режиме независимо от жизненного цикла приложения.Это правильно?Мои первые тесты показывают, что Работа выполняется только во время работы приложения.

val locationWork = PeriodicWorkRequest.Builder(UpdateDatabaseWorker::class.java, 24, TimeUnit.HOURS)
                        .addTag("DATABASE_UPDATE_SERVICE")
                        .build()
WorkManager.getInstance().enqueue(locationWork)

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Вот что говорит документация:

Примечание. WorkManager предназначен для задач, требующих гарантии того, что система их запустит, даже если приложение выйдет, например, для загрузки данных приложения на сервер.Он не предназначен для фоновой работы в процессе, которую можно безопасно прекратить, если процесс приложения завершится;для подобных ситуаций мы рекомендуем использовать ThreadPools.

Но должно быть какое-то условие. если это условие выполнено, WorkManager запустит задачу (это важно).Условия , такие как «только во время зарядки устройства и в режиме онлайн»

Прочтите это внимательно , WorkManager пытается запустить вашу задачу с интервалом, который вы запрашиваете, с учетом налагаемых вами ограничений и других его требований.

Здесь я нашел хороший учебник о том, как использовать WorkManager для планирования задач: https://android.jlelse.eu/how-scheduling-work-with-new-android-jetpack-component-workmanager-852163f4825b

0 голосов
/ 02 октября 2018

На основании различных проблем, о которых сообщалось в WorkManager bugtracker , их документация не совсем точна относительно точного поведения WorkManager в таких крайних случаях.

На определенных устройствах приложения принудительно останавливаются при удалении приложения из диспетчера задач, поэтому ожидается, что эта часть будет ожидаемой.... source


К сожалению, некоторые устройства реализуют отключение приложения из меню «Последние» в качестве принудительной остановки.Сток Android не делает этого.Когда приложение принудительно останавливается, оно не может выполнять задания, получать сигналы тревоги или широковещательные сообщения и т. Д. Поэтому, к сожалению, мы не можем решить эту проблему - проблема заключается в ОС, а обходного пути нет. source


Единственная проблема, с которой мы столкнулись, - это случай, когда некоторые китайские OEM-производители рассматривают смахивание для увольнения из Recents как принудительную остановку.Когда это произойдет, WorkManager перепланирует все ожидающие задания при следующем запуске приложения.Учитывая, что это нарушение CDD, WorkManager может сделать гораздо больше, учитывая свою клиентскую библиотеку. source


Чтобы добавить к этому, если производитель устройства решил изменить стандартный Android для принудительной остановки приложения, WorkManager перестанет работать (как и JobScheduler, аварийные сигналы, трансляцияприемники и т. д.).Нет способа обойти это.К сожалению, некоторые производители устройств делают это, поэтому в этих случаях WorkManager перестанет работать до следующего запуска приложения. source


При интенсивном тестировании OneTimeWorkRequest (без ограничений) на Pixel 2 XL со стандартным Android поведение выглядит следующим образом:

  • Закрытие диспетчера задач:
    • Работа продолжается (через некоторое время)
  • Перезагрузка устройства (работа выполняется):
    • Работа продолжается после перезагрузки
  • Информация о приложении "Force stop":
    • Работа останавливается, будет только продолжатьсяпри повторном запуске приложения
  • Перезагрузка устройства (работа была «Force Stopped»):
    • Работа не продолжается до тех пор, пока приложение не запустится снова

Полный список различных вариантов поведения OEM можно найти на dontkillmyapp.com .Похоже, что команда Android также признала эту проблему и добавила тест для этого в свой тест CTS для Android Q. source

0 голосов
/ 04 июня 2018

Насколько я понимаю, после запланированного запуска он всегда будет работать в фоновом режиме независимо от жизненного цикла приложения.Это верно?

Да.На основе документации

Задание все равно гарантированно будет выполнено, даже если ваше приложение принудительно завершено или устройство перезагружено.

WorkManager выбирает подходящий способ запуска задачи на основе таких факторов, как уровень API устройства и состояние приложения.Если WorkManager выполняет одну из ваших задач во время работы приложения, WorkManager может запустить вашу задачу в новом потоке процесса вашего приложения.Если ваше приложение не запущено, WorkManager выбирает подходящий способ планирования фоновой задачи - в зависимости от уровня API устройства.

WorkManager может использовать JobScheduler, Firebase JobDispatcher или AlarmManager в зависимости от уровня API.Он будет соблюдать Дозировку и учитывать все другие ограничения перед выполнением Работы.Вы можете ожидать некоторую задержку в режиме ожидания, так как он может ожидать окно обслуживания.

Примечание:

WorkManager предназначен для задач, требующих гарантии того, чтоСистема запустит их, даже если приложение выйдет, например, загрузит данные приложения на сервер.Он не предназначен для фоновой работы в процессе, которую можно безопасно прекратить, если процесс приложения завершится;для подобных ситуаций мы рекомендуем использовать ThreadPools.

...