Выберите правильный API, чтобы устройство оставалось в активном состоянии

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

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

Выберите правильную технологию

Оптимальный вариант поддержания устройства в спящем режиме зависит от потребностей вашего приложения. Этот раздел поможет вам выбрать правильный подход.

Блок-схема, иллюстрирующая выбор правильного подхода к поддержанию устройства в активном состоянии. Содержание блок-схемы подробно описано далее.

  • Необходимо ли вашему приложению держать экран включенным?
    • Если да , см. раздел «Поддержание экрана включённым» . Возможно, существует специализированный API, который выполняет необходимые функции; например, если вы реализуете интерфейс телефонного звонка, вы можете использовать фреймворк Android Telecom , который поддерживает экран включённым при необходимости. Если специализированного API для вашей ситуации нет, можно использовать API keepScreenOn .
  • Запускает ли ваше приложение службу переднего плана, и вам необходимо, чтобы устройство оставалось в активном состоянии, когда экран выключен, пока работает служба?
    • Если нет , вам не нужно поддерживать устройство в спящем режиме. Если пользователь активно взаимодействует с приложением, устройство будет оставаться в спящем режиме. Если пользователь не взаимодействует с вашим приложением и вы не запускаете службу переднего плана, вам следует разрешить устройству переходить в режим ожидания при необходимости. Если вам просто нужно убедиться, что какая-то работа выполняется, пока пользователь не работает с приложением, обратитесь к документации по фоновым задачам , чтобы найти оптимальный вариант.
    • Если да , сначала убедитесь, что вам действительно нужно использовать службу переднего плана. В зависимости от ситуации, вместо службы переднего плана можно использовать специализированный API. Информацию о них можно найти в документации по службе переднего плана . Например, если вам нужно отслеживать местоположение пользователя, вы можете использовать API геозон вместо службы переднего location .
  • Будет ли отрицательно сказываться на пользовательском опыте, если устройство приостановится во время работы активной службы и при этом экран устройства будет выключен? (Например, если вы используете активную службу для обновления уведомлений, то приостановка работы устройства не будет отрицательной для пользовательского опыта.)
    • Если «Нет» , не используйте блокировку пробуждения. Действие возобновляется автоматически, как только пользователь взаимодействует со своим устройством, выводя его из режима ожидания.
    • Если да , вам может потребоваться блокировка пробуждения . Тем не менее, вам всё равно следует проверить, используете ли вы уже API или выполняете ли действие, объявляющее блокировку пробуждения от вашего имени, как описано в разделе Действия, поддерживающие устройство в бодрствующем состоянии .

Действия, которые поддерживают устройство в активном состоянии

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

  • Если вы воспроизводите аудио, аудиосистема устанавливает и управляет блокировкой спящего режима; вам не нужно делать это самостоятельно.
  • Если вы используете API-интерфейсы планирования задач или библиотеки, такие как WorkManager , JobScheduler или DownloadManager , система или библиотека получает блокировку пробуждения, которая приписывается вашему приложению.
  • Если вы используете Media3 ExoPlayer , вы можете использовать ExoPlayer.setWakeMode() чтобы проигрыватель установил для вас блокировку пробуждения.
  • Некоторые датчики устройства являются датчиками пробуждения; с помощью SensorManager можно настроить эти датчики на пробуждение устройства при наличии данных для передачи. Чтобы проверить, является ли датчик датчиком пробуждения, вызовите Sensor.isWakeUpSensor .
  • Если вы запланируете будильник , устройство проснется, когда он сработает, даже если ваше приложение не запущено.

Смотрите также