Android Oreo убивает фоновые сервисы и сбрасывает ожидающие тревоги, запланированные задания после перехода в режим ожидания - PullRequest
0 голосов
/ 24 мая 2018

Мое приложение имеет фоновый режим service, который обновляет пользователей location и обновляет его на сервере каждые пять минут.Чтобы непрерывно запускать процесс обновления location, я использую диспетчер аварийных сигналов, чтобы установить время его следующего запуска из самого service.Тем не менее, когда я устанавливаю приложение в моем Nokia 6 работающем Android 8.1, оно работает некоторое время, и если я некоторое время не использую телефон, мой service будет убит следующими сигналами тревоги, которые также удаляются из приложения.система alarm manager.Я предположил, что простой заставляет телефон вводить doze mode.Тем не менее, я не понимаю, почему менеджеры тревоги были очищены.Насколько я понимаю, doze mode должен периодически открывать окна обслуживания для выполнения любых ожидающих выполнения задач.

Чтобы смягчить эту проблему, я попытался применить JobScheduler service поверх AlarmManager, чтоработает каждые 15 минут.Цель этого jobscheduler состояла в том, чтобы перезапустить service, в котором есть alarmmanager, поэтому, даже если он будет убит и сигнал тревоги сброшен, jobscheduler снова включит service.

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

В документации Android сказано, что мы можем использовать JobScheduler, чтобы смягчить ограничения фонового выполнения.И чтобы проверить это, я принудительно убил два services, когда я тестировал приложение, но уже запланированное задание не было очищено, и он заставил service с сигналом тревоги снова запуститься.Я не понимаю причину такого поведения, хотя ребята из Evernote дают объяснение, которое могло бы соответствовать этому сценарию здесь Android Job от Evernote

Есть идеи для такого ненормального поведения?

Сведения о тестовой среде

  • Устройство: Nokia 6 (TA-1021)
  • ОС: Android 8.1.0

Ответы [ 5 ]

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

Я предположил, что в настоящее время режим DOZE не разрешен для фонового обслуживания, поэтому вам нужно найти способ, которым режим DOZE не повлияет на ваше приложение. Для решения вашей проблемы вы должны использовать службу переднего плана.или сделайте некоторые настройки батареи.В любом случае, мой лучший вариант - использовать Firebase Cloud Messaging

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

Вы не сможете запускать фоновые службы, долго работающие в Oreo, поскольку есть изменения в поведении, теперь Oreo оптимизирует системную память, батарею и т. Д., Он убивает фоновые службы, чтобы решить вашу проблему, вы должны использовать службу переднего плана.

Посмотрите на пределы фонового исполнения https://developer.android.com/about/versions/oreo/android-8.0-changes

Предложение от меня, если вы можете использовать FCM, тогда пойдите, потому что такие приложения, как WeChat, Facebook используют его для доставки уведомлений, и они нене сталкиваюсь с какой-либо проблемой ...

Надеюсь, это поможет понять проблему ....

0 голосов
/ 27 мая 2018

В настоящее время я сталкиваюсь с той же проблемой и делаю то же самое, что и вы.Это значит, что для Jobscheduler необходимо периодически запускать мою службу Foreground Service каждые 15 минут на случай, если ее уничтожат по тем или иным причинам, например, по причине уничтоженной задачи.Это работает как очарование на предварительных версиях Oreo.

Для Oreo единственное решение, которое меня сейчас радует, - разрешить автозапуску приложения в настройках.Под установленными приложениями то есть.Тогда он должен снова работать как pre Oreo.Что я слышал, но еще не тестировал, так это установил параметр setPersisted (true) в планировщике заданий.Дайте мне знать, если это поможет

0 голосов
/ 29 мая 2018

У меня была такая же проблема с телефонами Oppo, Vivo, Mi и т. Д., После удаления из недавних приложений приложение убивалось, даже сервисы убивались

Решение: я добавил разрешения на автозапуск, подобные этому, в моем приложении иэто сработало.

После решения этой проблемы мое приложение зависало / убивалось после некоторого времени работы в фоновом режиме из-за режима DOZE

Решение: для этого условия простоперейдите в -> Настройки -> Батарея и позвольте вашему приложению работать в фоновом режиме , если вы сделаете это, режим DOZE не повлияет на ваше приложение,

Cheers

0 голосов
/ 27 мая 2018

В Doze more аварийные сигналы не сбрасываются, а переносятся на более позднее время.У вас есть два основных варианта:

  1. Используйте либо setAndAllowWhileIdle(), либо setExactAndAllowWhileIdle().Однако они также могут срабатывать с максимальной частотой 1 раз в 9 минут .Поэтому вам придется уменьшить частоту, с которой вы получаете местоположение в своем приложении.

  2. Используйте службу переднего плана путем отображения уведомления переднего плана.Это делают все (такие приложения, как Uber, Google Maps и т. Д.).Таким образом, ваш сервис не будет убит и будет рассматриваться так, как будто у вас открыто приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...