Android AlarmManager-RTC WAKEUP vs истекшее пробуждение в реальном времени
может кто-нибудь объяснить мне разницу между AlarmManager.RTC_WAKEUP
и AlarmManager.ELAPSED_REALTIME_WAKEUP
? Я прочитал документацию, но до сих пор не совсем понимаю смысл использования одного над другим.
пример кода:
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
scheduledAlarmTime,
pendingIntent);
alarmManager.set(AlarmManager.RTC_WAKEUP,
scheduledAlarmTime,
pendingIntent);
насколько разные будут выполняться две строки кода? Когда эти две строки кода будут выполняться относительно друг друга?
Я ценю вашу помощь.
5 ответов:
AlarmManager.ELAPSED_REALTIME_WAKEUP
тип используется для запуска сигнала тревоги с момента загрузки:alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 600000, pendingIntent);
фактически сделает сигнал тревоги пойти 10 мин после загрузки устройства.
есть таймер, который запускается при загрузке устройства, чтобы измерить время работы устройства, и это тип, который вызывает вашей тревоги по времени безотказной работы прибора.
а,
AlarmManager.RTC_WAKEUP
вызовет сигнал тревоги в соответствии со временем часов. Например, если вы делать:long thirtySecondsFromNow = System.currentTimeMillis() + 30 * 1000; alarmManager.set(AlarmManager.RTC_WAKEUP, thirtySecondsFromNow , pendingIntent);
этого, с другой стороны, вызовет тревогу через 30 секунд.
AlarmManager.ELAPSED_REALTIME_WAKEUP
тип редко используется по сравнению сAlarmManager.RTC_WAKEUP
.
несмотря на принятый в настоящее время и проголосованный ответ, AlarmManager.ELAPSED_REALTIME * типы вместе с SystemClock.elapsedRealtime () всегда был более надежным, чем часы RTC для сигнализации и синхронизации.
использование ELAPSED_REALTIME_WAKEUP с AlarmManager будет опираться на монотонные часы, начиная с момента загрузки"и продолжает тикать, даже когда процессор находится в режиме энергосбережения, так что рекомендуется основа для общего назначения интервала времени". Итак,
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60*1000, pendingIntent);
сделает ваш огонь PendingIntent в 1 минуте (60*1000 миллисекунд).
Тогда Как, AlarmManager.RTC_WAKEUP - это стандартное время "стены" в миллисекундах с момента эпохи. Итак,
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 60*10000, pendingIntent);
может также вызвать тревогу через 60 секунд, но не надежно, потому что, как отмечено в документация SystemClock:
настенные часы могут быть установлены пользователем или телефонную сеть (см. setCurrentTimeMillis (long)), поэтому время может прыгать назад или вперед непредсказуемо. Эти часы должны использоваться только тогда, когда переписка с реальными датами и временем имеет важное значение, например в приложении календаря или будильника. Интервал или прошедшее время измерения должны использовать другие часы. Если вы используете Система.currentTimeMillis (), рассмотрите возможность прослушивания ACTION_TIME_TICK, ACTION_TIME_CHANGED и ACTION_TIMEZONE_CHANGED Намерение вещает, чтобы узнать, когда время изменения.
кроме того, вопрос ссылается только на сигналы тревоги *_WAKEUP, но см. также AlarmManager документация по этому вопросу, чтобы убедиться, что вы понимаете, что обеспечивают сигналы пробуждения против не-пробуждения.
просто к сведению. Вы можете получить uptime millis calling:
long uptimeMillis = SystemClock.elapsedRealtime();
поэтому, если вы хотите запустить будильник через 30 секунд, и вы хотите использовать часы бесперебойной работы вместо обычных часов, вы можете сделать:
long thirtySecondsFromNow = SystemClock.elapsedRealtime() + 30 * 1000; alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, thirtySecondsFromNow, pendingIntent);
всякий раз, когда вы хотите проверить некоторое прошедшее время вместо определенной даты/времени, лучше всего использовать время безотказной работы. Это потому, что текущее время, установленное пользователем в устройстве, может измениться, если пользователь изменит его с помощью настроек.
я запрограммировал эту проблему в своем собственном проекте таким образом. в приведенном ниже коде я использую
AlarmManager.ELAPSED_REALTIME_WAKEUP
для установки будильника в определенное время. переменная 'intentName' используется в intentFilter для получения этого сигнала тревоги. потому что я запускаю много сигнализаций такого типа. когда я отменю все тревоги. я использую метод отмены. дано в самом низу.
//для удержания сигналов тревоги и отмены при необходимости
public static ArrayList<String> alarmIntens = new ArrayList<String>();
//
public static String setAlarm(int hour, int minutes, long repeatInterval, final Context c) { /* * to use elapsed realTime monotonic clock, and fire alarm at a specific time * we need to know the span between current time and the time of alarm. * then we can add this span to 'elapsedRealTime' to fire the alarm at that time * this way we can get alarms even when device is in sleep mood */ Time nowTime = new Time(); nowTime.setToNow(); Time startTime = new Time(nowTime); startTime.hour = hour; startTime.minute = minutes; //get the span from current time to alarm time 'startTime' long spanToStart = TimeUtils.spanInMillis(nowTime, startTime); // intentName = "AlarmBroadcast_" + nowTime.toString(); Intent intent = new Intent(intentName); alarmIntens.add(intentName); PendingIntent pi = PendingIntent.getBroadcast(c, alarms++, intent, PendingIntent.FLAG_UPDATE_CURRENT); // AlarmManager am = (AlarmManager) c .getSystemService(Context.ALARM_SERVICE); //adding span to elapsedRealTime long elapsedRealTime = SystemClock.elapsedRealtime(); Time t1 = new Time(); t1.set(elapsedRealTime); t1.second=0;//cut inexact timings, seconds etc elapsedRealTime = t1.toMillis(true); if (!(repeatInterval == -1)) am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, elapsedRealTime + spanToStart, repeatInterval, pi); else am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, elapsedRealTime + spanToStart, pi);
где функция пролет это:
public static long spanInMillis(Time startTime, Time endTime) { long diff = endTime.toMillis(true) - startTime.toMillis(true); if (diff >= 0) return diff; else return AlarmManager.INTERVAL_DAY - Math.abs(diff); }
сигнал отключить это.
public static void cancel(Context c) { AlarmManager am = (AlarmManager) c .getSystemService(Context.ALARM_SERVICE); // cancel all alarms for (Iterator<String> iterator = alarmIntens.iterator(); iterator .hasNext();) { String intentName = (String) iterator.next(); // cancel Intent intent = new Intent(intentName); PendingIntent pi = PendingIntent.getBroadcast(c, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); am.cancel(pi); // iterator.remove(); } }
важные заметки при выбор сигнализации для использования:(за кого кто уже читал проголосовавших)
The
RTC_WAKEUP
Долина Смерти - изменить момент:
Если пользователь вручную изменил время на прошлое, сигнал тревоги не сработает, и будущее заставит сигнал тревоги немедленно сработать, если он прошелRTC
метки.
не используйте этот сигнал тревоги для выполнения любой проверки на стороне клиента / важно работа потому что у нее есть шанс провалиться.The
WAKEUP
значение (зефир и выше)
В общем-не много. Не будет пробуждать устройство, когдаidle
илиdoze
, потому чтоalarmManager.setExactAndAllowWhileIdle
илиalarmManager.setAndAllowWhileIdle
(Дремать И Бездействовать)