Как можно выйти из режима Doze и заставить приложение что-то делать в этом состоянии

Всем привет! В команде Navigine мы уже восемь лет предоставляем мобильные технологии внутреннего и внешнего позиционирования, которые позволяют использовать передовые решения для внутренней навигации и приближения.

Сегодня мы хотим продолжить серию статей, связанных с запуском фоновых задач на Android-устройствах с уровнем API выше 23 (Android 6 - Marshmallow). В наших предыдущих статьях мы уже говорили о режиме ожидания, нескольких способах работы в фоновом режиме с использованием служб, планировщика заданий и диспетчера работ, также у нас была отдельная статья об использовании служб переднего плана. И сегодня мы решили подробно поговорить о том, как лучше оптимизировать функцию и чем она может быть вам полезна.

Режим дремоты и режим ожидания приложений

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

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

  • Система игнорирует блокировки слежения;
  • Сетевое соединение недоступно;
  • Система не выполняет сканирование WiFi, WiFi RTT и BLE;
  • Стандартные сигналы тревоги AlarmManager будут перенесены;
  • Система не поддерживает JobScheduler и WorkManager.

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

  • В приложении есть процесс на переднем плане;
  • В приложении есть уведомление, которое пользователь может видеть на заблокированном экране и в панели уведомлений;
  • Пользователь явно запускает приложение.

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

Оптимизация батареи

Оптимизация заряда батареи позволяет поместить ваше приложение в белый список. По умолчанию он выключен. Приложения, доступные в белом списке, частично освобождены от оптимизаций Doze и App Standby. Это не означает, что они имеют полный доступ и могут выполнять задачи в спящем режиме. Приложение, внесенное в белый список, может использовать сеть и удерживать частичную блокировку пробуждения во время Doze и App Standby. Тем не менее, другие ограничения, такие как изменение заданий, стандартные триггеры сигналов тревоги, по-прежнему применяются.

В таблице на скриншоте выше показаны допустимые варианты использования для запроса или включения в белый список исключений оптимизации батареи. Кстати, вот важное замечание: вы не сможете публиковать свое приложение в магазине Google Play, имея это разрешение в своем приложении.

Код для запроса разрешения на оптимизацию батареи

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

<uses-permission 
android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

И добавьте этот код в свой код, чтобы он переместил вас прямо в настройки, где вы можете переместить свое приложение в белый список:

Или вы можете вручную настроить белый список в Настройки ›Батарея› Оптимизация заряда батареи.

Заключение

Как бы многообещающе ни звучало название этой функции, она все равно не оказывается столь полезной в разработке, потому что не помогает полностью победить дремлющий режим, а также не может быть использована, если вы собираетесь поместить свое приложение в магазин Google Play. Поэтому остается полагаться на другие инструменты или стараться не делать что-то в фоновом режиме. Также стоит обратить внимание на инструменты, которые предлагает сам Google, например, FCM.

Надеемся, статья будет вам полезна и вы поймете, что эта функция не так полезна и удобна, как вы могли подумать. Не стесняйтесь задавать свои вопросы!