Подтвердить что ты не робот

Разница между setRepeating и setInexactRepeating AlarmManager

Каковы следующие параметры:

alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_FIFTEEN_MINUTES, alarmIntent);

И следующее:

alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
        AlarmManager.INTERVAL_DAY, alarmIntent);

В чем разница, а также как две разные функции?

4b9b3361

Ответ 1

В обоих примерах указывается повторяющийся сигнал тревоги, который отправит данный alarmIntent. В обоих случаях при первом отправке будет немедленно (calendar.getTimeInMillis()возвращает текущее время). В обоих случаях устройство будет разбужено, когда сигнал тревоги должен быть отправлен (как видно на AlarmManager.RTC_WAKEUP).

Между этими вызовами существуют две отличия. Более простым является то, что намерение будет отправляться каждые 15 минут при первом вызове и каждый день при втором вызове (как вы можете видеть в третьем параметре). Более сложное различие заключается в самом вызове функции: setRepeating будет планировать первый сигнал тревоги для точно каждые пятнадцать минут; setInexactRepeating будет планировать второй сигнал тревоги для приблизительно каждые 24 часа, что означает, что он может отклониться от этого интервала - с преимуществом потреблять меньше энергии.

Заметьте, что это изменилось в API 19, где эти два вызова являются синонимами. См. данное руководство и эту документацию API.

Ответ 2

Определите, насколько точным будет ваша тревога

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

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

Для редкого приложения, которое, например, имеет жесткие требования времени, будильник должен стрелять точно в 4:00 вечера. затем используйте setRepeating().

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

Ответ 3

Чтобы увеличить предыдущие ответы, при использовании повторяющихся аварийных сигналов необходимо учитывать ряд других лучших практик, в частности, неточные сигналы тревоги, запрашиваемые с помощью setInexactRepeating().

Тип сигнала

  • Сигналы не-WAKEUP лучше, чем аварийные сигналы WAKEUP с точки зрения управления питанием. Используя предыдущий, ваш будильник может срабатывать поздно, но он все равно срабатывает, когда устройство разбужено пользователем или когда срабатывает другой сигнал будильника. Использование аварийных сигналов WAKEUP приведет к выходу из строя устройства, потреблению дополнительной батареи и потенциально вызвавшему другие неточные сигналы тревоги, которые были задержаны, которые в противном случае могли быть задержаны дольше (что уменьшает эффективность энергосбережения, обеспечиваемое неточными сигналами).
  • Предпочитают сигналы тревоги, используя временную базу ELAPSED, а не временную базу RTC. Первые чаще имеют более случайное распределение между устройствами, чем сигналы RTC, что снижает риск перегрузки сети и на сервере, если тревога вызывает какой-то опрос. Телефоны, работающие с пряниками (или старше), страдают от ошибки, в результате которой неточные сигналы RTC имеют тенденцию совмещаться с часами реального времени, например. приблизительно 30 с каждой четверти часа. Аварии ELAPSED не страдают от этой ошибки на этих ранних версиях платформы. Даже если ваш сигнал тревоги не вызывает никакой сетевой активности, помните, что если это сигнал будильника, он может инициировать другие неполадки, которые могут возникнуть в сети.

Timebase

  • Будьте осторожны, чтобы указать требуемое время начала в правильной временной области для типа тревоги. Несоблюдение этого требования может привести к тому, что в прошлом были установлены аварийные сигналы (они сразу срабатывают), если вы устанавливаете аварийный сигнал RTC с использованием временной шкалы ELAPSED или в будущем, если вы устанавливаете аварийный сигнал ELAPSED с использованием временной шкалы RTC. Вы можете проверить, какие аварийные сигналы запланировано для приложения, используя dumpsys alarm через adb shell.

Interval

  • Указание неточного интервала тревоги любого значения, кроме интервальных констант, определенных в API AlarmManager, избыточно в SDK и 19: они будут назначены как точные неточные сигналы тревоги, теряя все преимущества энергосбережения, которые обеспечивают неточные сигналы.

Изменить: здесь дополнительное объяснение ошибки, связанной с устройствами для пряников и сотов 3.0: https://code.google.com/p/android/issues/detail?id=31550

Ответ 4

setRepeating более точная и setInexactRepeating - это для экономии батареи, но без точной, setInexactRepeating хорош для обслуживания в фоновом режиме, например, и setRepeating необходим, например, для будильника.