Intereting Posts
Максимальное значение для кода версии? Ошибка ThreeTen-Backport на Android – ZoneRulesException: файлы данных с часовыми поясами не зарегистрированы Могут ли запущенные и связанные службы жить «навсегда»? Полная поддержка Android для пакетов OSGi Определите, какой AlertDialog запускается onClick (диалог DialogInterface, int which) Конфликт между несколькими библиотеками «android-support-v4» Как просматривать Javascript-консоль браузера запаса в Android Galaxy S4 Коснитесь в любом месте, чтобы открыть меню открытия навигационного ящика В чем преимущество загрузчиков через Asynctask в Android? Android Speech Recognition как услуга на Android 4.1 и 4.2 Шаблоны для конвертации вкладок, чтобы просмотреть навигацию, если нет места Вызов finish () не завершает работу Android: Невозможно получить данные изображения RAW с камеры? Как Dalvik VM сохраняет и восстанавливает свои регистры между вызовами методов? Назад Проецирование в Java с помощью OpenCV

Android AlarmManager – RTC_WAKEUP vs ELAPSED_REALTIME_WAKEUP

Может ли кто-нибудь объяснить мне разницу между AlarmManager.RTC_WAKEUP и AlarmManager.ELAPSED_REALTIME_WAKEUP ? Я прочитал документацию, но до сих пор не понимаю смысла использования одного над другим.

Пример кода:

  alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, scheduledAlarmTime, pendingIntent); alarmManager.set(AlarmManager.RTC_WAKEUP, scheduledAlarmTime, pendingIntent); 

Каким образом выполняются две строки кода? Когда эти две строки кода будут выполняться относительно друг друга?

Я ценю вашу помощь.

Solutions Collecting From Web of "Android AlarmManager – RTC_WAKEUP vs ELAPSED_REALTIME_WAKEUP"

Тип 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)), поэтому время может скачкообразно переходить назад или вперед. Эти часы должны использоваться только тогда, когда важна переписка с реальными датами и временем, например, в приложении календаря или будильника. Интервалы или прошедшие измерения времени должны использовать разные часы. Если вы используете System.currentTimeMillis (), подумайте о прослушивании ACTION_TIME_TICK, ACTION_TIME_CHANGED и ACTION_TIMEZONE_CHANGED Intent трансляций, чтобы узнать, когда изменится время.

Кроме того, на этот вопрос были указаны только аварийные сигналы * _WAKEUP, но см. Также документацию AlarmManager , чтобы убедиться, что вы понимаете, что обеспечивают сигналы пробуждения и предупреждения без пробуждения.

Просто записка. Вы можете получить миллионы времени ожидания:

 long uptimeMillis = SystemClock.elapsedRealtime(); 

Поэтому, если вы хотите запустить будильник через 30 секунд, и вы хотите использовать часы безотказной работы вместо обычных часов, вы можете сделать:

 long thirtySecondsFromNow = SystemClock.elapsedRealtime() + 30 * 1000; alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, thirtySecondsFromNow, pendingIntent); 

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

Я запрограммировал эту проблему в своем собственном проекте таким образом. В нижнем коде, который я использую

 AlarmManager.ELAPSED_REALTIME_WAKEUP 

Для установки тревоги в определенное время. Переменная «aimName» используется в файле намерения для получения этого сигнала. Потому что я увольняю много тревог этого типа. Когда я отменяю все аварийные сигналы. Я использую метод cancel. Дано в нижней части.

// удерживать тревоги и отменить при необходимости

  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); 

Где функция span такова:

  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(); } } 

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

RTC_WAKEUP смерти RTC_WAKEUP – изменение времени:
Если пользователь вручную изменил время на прошлое, сигнал тревоги не погаснет, и в будущем это приведет к немедленному отключению будильника, если оно прошло через метку времени RTC .
Не используйте этот аварийный сигнал для выполнения каких-либо проверок на стороне клиента или важных заданий, потому что у него есть шанс выйти из строя.

Значение WAKEUP (Зефир и выше)
В общем – мало. Не будет пробуждать устройство в idle или в doze , для этого alarmManager.setExactAndAllowWhileIdle или alarmManager.setAndAllowWhileIdle ( Doze & Idle )