Чрезмерные пробуждения

Пробуждение — это механизм в API AlarmManager , который позволяет разработчикам устанавливать будильник для пробуждения устройства в указанное время. Ваше приложение устанавливает будильник, вызывая один из методов set() в AlarmManager с флагом RTC_WAKEUP или ELAPSED_REALTIME_WAKEUP . При срабатывании будильника устройство выходит из режима пониженного энергопотребления и удерживает частичную блокировку пробуждения при выполнении метода onReceive() или onAlarm() будильника. Если будильники срабатывают слишком часто, они могут разрядить аккумулятор устройства.

Чтобы помочь вам улучшить качество приложений, Android автоматически отслеживает приложения на наличие чрезмерных сигналов пробуждения и отображает информацию в Android Vitals. Информацию о том, как собираются данные, можно найти в документации Play Console .

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

Устранить проблему

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

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

  • Найдите вызовы различных методов set() в AlarmManager , которые включают флаг RTC_WAKEUP или ELAPSED_REALTIME_WAKEUP .

  • Мы рекомендуем включать имя вашего пакета, класса или метода в имя тега вашего сигнала тревоги, чтобы вы могли легко определить место в источнике, где был установлен сигнал тревоги. Вот несколько дополнительных советов:

    • Оставьте в имени любую личную информацию (PII), например адрес электронной почты. В противном случае устройство регистрирует _UNKNOWN вместо имени сигнала тревоги.
    • Не получайте имя класса или метода программным путем, например, вызывая getName() , потому что Proguard может его запутать. Вместо этого используйте жестко запрограммированную строку.
    • Не добавляйте счетчик или уникальные идентификаторы в теги сигналов тревоги. Система не сможет агрегировать сигналы тревоги, настроенные таким образом, поскольку все они имеют уникальные идентификаторы.

После устранения проблемы убедитесь, что ваши сигналы пробуждения работают должным образом, выполнив следующую команду ADB :

adb shell dumpsys alarm

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

Лучшие практики

Используйте сигналы пробуждения только в том случае, если вашему приложению необходимо выполнить операцию, обращенную к пользователю (например, опубликовать уведомление или предупредить пользователя). Список лучших практик AlarmManager см. в разделе «Планирование сигналов тревоги» .

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

  • пакетная обработка — задания объединяются, чтобы снизить расход заряда батареи
  • постоянство — если устройство перезагружается, запланированные задания WorkManager запускаются после завершения перезагрузки.
  • критерии — задания могут выполняться в зависимости от условий, например от того, заряжается ли устройство или доступен ли Wi-Fi.

Дополнительную информацию см. в разделе Руководство по фоновой обработке .

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

{% дословно %} {% дословно %} {% дословно %} {% дословно %}