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

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

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

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

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

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

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

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

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

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

adb shell dumpsys alarm

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

Передовые методы

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

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

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

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

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

{% verbatim %} {% endverbatim %} {% verbatim %} {% endverbatim %} ,

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

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

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

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

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

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

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

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

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

adb shell dumpsys alarm

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

Передовые методы

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

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

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

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

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

{% verbatim %} {% endverbatim %} {% verbatim %} {% endverbatim %} ,

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

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

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

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

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

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

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

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

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

adb shell dumpsys alarm

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

Передовые методы

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

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

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

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

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

{% verbatim %} {% endverbatim %} {% verbatim %} {% endverbatim %}