Android. Работает ли WorkManager при закрытии приложения?

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

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

person Tuesday Four AM    schedule 04.06.2018    source источник


Ответы (3)


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

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


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


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


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


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

  • Task manager close:
    • Work continues (after a bit)
  • Reboot device (work running):
    • Work continues after reboot done
  • App info "Force stop":
    • Work stops, will only continue when app is started again
  • Reboot device (work was "Force Stopped"):
    • Work does not continue until the app is started again

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

person mikepenz    schedule 02.10.2018
comment
В чем разница между перезагрузкой устройства (работа запущена) и перезагрузкой (работа принудительно остановлена)? В обоих случаях работа продолжалась при перезагрузке устройства. - person AndroidDev; 17.07.2019
comment
На моем Nexus 6P, если я перезапущу устройство, когда работа не ведется, но планируется запустить в ближайшем будущем, оно никогда не запустится, пока не запустится приложение. Я тестировал это с помощью OneTimeWorkRequest. Однако, если приложение запущено, а рабочий процесс не запущен, но его запуск запланирован в ближайшем будущем, но вы проведете пальцем по приложению, чтобы закрыть его, удалив его из меню «Последние», оно запустится в запланированное время. - person AndroidDev; 17.07.2019
comment
@AndroidDev: да, стандартный Android позволит запустить его, если вы проведете пальцем в меню недавних событий, потому что это не приведет к принудительному закрытию приложения. но самсунг, например, убивает силой. для перезагрузки. какая версия Android у вас установлена, а также какая версия workmanager. это может повлиять и на вещи - person mikepenz; 18.07.2019
comment
@AndroidDev force stop актуален. поскольку принудительная остановка убивает весь процесс и запрещает ему автоматический запуск. просто перечислил это для полной картины - person mikepenz; 18.07.2019
comment
The only issue that we have come across is the case where some Chinese OEMs treat swipe to dismiss from Recents as a force stop. When that happens, WorkManager will reschedule all pending jobs, next time the app starts up. - что с этим делать? - person Pavel Poley; 26.07.2019
comment
@PavelPoley, ты ничего не можешь с этим поделать. Это спецификация системы Android. Приложение и процесс не могут обойти это, поскольку это жесткое ограничение. Это также гарантирует, что если вы принудительно остановите приложение, оно останется остановленным, и ваш телефон будет работать даже со многими дрянными приложениями. - person mikepenz; 26.07.2019
comment
Но насколько серьезное приложение, такое как WhatsApp / Telegram, справится с этим? - person Pavel Poley; 30.07.2019
comment
Если вы принудительно завершите работу приложения, оно не сможет выполнять фоновую работу. Но (я считаю) вполне возможно, что он получает уведомление от FCM, и если пользователь взаимодействует с уведомлением, он запускает приложение (хотя я никогда не пробовал этот конкретный сценарий, поэтому отнеситесь к этому комментарию с долей скептицизма) - person mikepenz; 31.07.2019
comment
@PavelPoley, это может вас заинтересовать: twitter.com/MishaalRahman/status/115701813001267610 s = 19 - person mikepenz; 02.08.2019
comment
Приятно видеть, что они упростили работу с WorkManager. - person Jeffrey Blattman; 21.02.2020
comment
@mikepenz Я зря потратил время на устройство Vivo и остановился, прочитав ваш ответ. Это очень большие ограничения. Интересно, как приложение социальных сетей может синхронизироваться с сервером, если WorkManager не работает после завершения работы. Есть ли другая техника? - person compyutech; 22.04.2020
comment
Так будет ли это в 2020 году? - person IgorGanapolsky; 02.05.2020
comment
Процесс удаления приложения не запускает периодическую работу. Работает на эмуляторе Pixel 2, API 28. Запутался. - person azizbekian; 10.06.2020
comment
@azizbekian точно. если принудительно остановлено, задача больше не будет выполняться - person mikepenz; 11.06.2020
comment
@IgorGanapolsky, правила на самом деле предназначены для увеличения времени автономной работы и предотвращения запуска неизвестных / вредоносных приложений, если они не должны. дать пользователю контроль - person mikepenz; 11.06.2020
comment
@mikepenz, как очистка недавних задач считается плохим действием? Каждый пользователь делает это периодически, означает ли это, что все запланированные задания не должны выполняться? Тогда в каком случае будут выполняться задания? Только в том случае, если пользователь хотя бы раз запускал приложение и ни разу не очищал список недавних задач ?? Для меня это не имеет смысла. - person azizbekian; 11.06.2020
comment
Я убиваю процесс приложения от имени системы (то есть сценарий уничтожения процесса, когда данные должны быть сохранены внутри пакета и восстановлены при следующем запуске). Если система испытывает нехватку ресурсов и процесс приложения остановлен системой - в этом случае задание также не будет запущено. Мне любопытно, в чем тогда цель WorkManager? - person azizbekian; 11.06.2020
comment
@azizbekian Если вы убиваете приложение по своему усмотрению - от имени системы, то SavedStateHandle не о чем говорить. Вы можете использовать Bundle. Это поведение было подтверждено Google. - person IgorGanapolsky; 11.06.2020
comment
@IgorGanapolsky Если вы убиваете приложение по своему усмотрению, я имею в виду делать это с помощью команды adb, как если бы система убила процесс. Как бы вы иначе протестировали сценарий уничтожения процесса? - person azizbekian; 12.06.2020
comment
Кто-нибудь знает, какие идеи в видео около 8:40? Ребята говорят: приходите, поговорите с нами. У нас есть идеи. : D youtube.com/ - person Yavor Mitev; 13.10.2020

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

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

Выполнение задачи по-прежнему гарантировано, даже если ваше приложение завершается принудительно или устройство перезагружается.

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

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

Примечание.

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

person Sagar    schedule 04.06.2018
comment
Значит, достаточно поставить задачу в очередь только один раз, и она будет работать вечно, пока не будет явно отменена? Я заметил, что он запускается только один раз и когда приложение запущено. - person Tuesday Four AM; 04.06.2018
comment
@TuesdayFourAM Да. Достаточно. Он должен запускаться каждые 24 часа. Вы должны понимать, что для API ›Lollipop. Он будет использовать JobScheduler для планирования работы. Он будет соблюдать режим дремоты, и задача будет выполняться во время окна обслуживания. - person Sagar; 04.06.2018
comment
Я попробовал и запросил OneTimeWorkRequest в моем рабочем, я поставил простой журнал и спящий поток, он работал нормально, но как только я выхожу из приложения, проводя пальцем по экрану, журналов больше не было ... так что мне кажется, что он остановился .. - person Adeel Turk; 16.07.2018
comment
Что произойдет, если мы обновим приложение новой логикой для рабочей задачи? Будут ли обновлены задачи, уже поставленные в очередь, с учетом новой логики? - person Binod Adhikary; 28.08.2018
comment
На моем устройстве Android 9 диспетчер работы не работал, когда я закрыл приложение. Но мне очень нужно, чтобы моя служба работала всегда. - person Hilal; 10.06.2019
comment
мои ограничения .setRequiredNetworkType(NetworkType.CONNECTED). Я запустил свою работу, когда отключен, и закрыл приложение. Я подождал несколько минут и восстановил подключение к Интернету, пока приложение было закрыто и НИКАКОЕ ЗАДАНИЕ не выполнялось. Задание было выполнено только при перезапуске приложения. - person Aliton Oliveira; 24.01.2020
comment
Это верно, только если вы используете enqueueUniquePeriodicWork - person IgorGanapolsky; 03.05.2020

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

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

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

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

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

person Vikasdeep Singh    schedule 04.06.2018
comment
Итак, если, как в моем случае, я запускаю задачу без условий, она всегда будет выполняться? - person Tuesday Four AM; 04.06.2018
comment
@TuesdayFourAM нет, он не запустится. Вам нужно установить какое-то условие, когда это условие будет выполняться, оно запустит вашу задачу. Например; upload my photos to server when connected with Wifi. - person Vikasdeep Singh; 04.06.2018
comment
@TuesdayFourAM Добро пожаловать! - person Vikasdeep Singh; 04.06.2018
comment
Я добавил .setRequiredNetworkType (NetworkType.NOT_REQUIRED) в определение работы, и это не помогло. Работа была запущена только один раз и больше никогда не запускалась. Так что я до сих пор не совсем понимаю, как это работает. - person Tuesday Four AM; 04.06.2018
comment
Я следил за учебником, который вы добавили в свой комментарий, и также отправил этот вопрос автору учебника. - person Tuesday Four AM; 04.06.2018
comment
@TuesdayFourAM На каком устройстве вы тестируете? Возможно, некоторые поставщики слишком сильно нарушают CTS (Набор для тестирования совместимости). Попробуйте загрузить пакет и протестировать свое устройство, чтобы увидеть отчет о том, что не поддерживается вашим тестовым устройством. - person Sevastyan Savanyuk; 05.01.2019
comment
Не уверен, что это когда-либо было точным, но мой работник сейчас выполняет работу по расписанию, даже когда я не создаю никаких конкретных условий / ограничений. - person Nikos Hidalgo; 26.02.2020
comment
У меня одна ситуация, приложение убито, рабочий начинает обработку с уведомлением. но из-за какого-то исключения рабочий остановился. но уведомления остаются как есть. Мне нужен какой-то метод обратного вызова, который гарантированно будет вызван при уничтожении / остановке рабочего. - person cyrus000; 21.07.2020