Разница между 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);

В чем разница, а также чем они отличаются с точки зрения функциональности?


person User3    schedule 20.01.2014    source источник


Ответы (5)


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

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

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

person PaF    schedule 20.01.2014
comment
Итак, если я нацеливаюсь на SDK 18 и убираю свой Max sdk 19, нужно ли мне писать код для обоих по отдельности? - person User3; 20.01.2014
comment
Кроме того, если я привязываю службу к вызову после срабатывания сигнализации, нужно ли мне получать блокировку пробуждения? - person User3; 20.01.2014
comment
Нужно ли кодировать для обоих случаев отдельно, это ваше решение, основанное на ваших потребностях. Что я могу вам сказать, так это то, что поведение setRepeating() соответствует поведению setInexactRepeating() только тогда, когда targetSdkVersion равно 19. Для любого младшего targetSdkVersion их поведение отличается. - person PaF; 20.01.2014
comment
В контексте данного alarmIntent устройство будет бодрствовать. Если вы покинете контекст, устройство может вернуться в спящий режим. Так, например, если ваш alarmIntent запускает действие, наверняка устройство будет активным для действия, чтобы обработать намерение. Но если вы затем хотите запустить службу из своей активности, вызвав startService(), тогда да — вы должны взять блокировку пробуждения, чтобы убедиться, что служба запустится. см. пример. - person PaF; 20.01.2014

Решите, насколько точным должен быть ваш будильник

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

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

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

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

person Mehul Joisar    schedule 20.01.2014
comment
очень хорошее объяснение, особенно о setRepeating(). Спасибо. - person Muhammad Saqib; 30.08.2015

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

Тип будильника

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

Временная база

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

Интервал

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

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

person fingertricks    schedule 24.04.2014

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

person Jesus Dimrix    schedule 16.02.2015

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

person Karamat Subhani    schedule 28.04.2020