Pomimo obecnie zaakceptowanej i przegłosowanej odpowiedzi, typy AlarmManager.ELAPSED_REALTIME * wraz z SystemClock.elapsedRealtime () zawsze były bardziej niezawodne niż zegary RTC dla alarmów i czasu.
Używanie ELAPSED_REALTIME_WAKEUP z AlarmManager będzie polegać na zegarze monotonicznym począwszy od czasu rozruchu i będzie kontynuował tykanie nawet wtedy, gdy procesor jest w trybach oszczędzania energii, więc jest to zalecana podstawa dla ogólnego pomiaru czasu w odstępach czasu . Więc,
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()
+ 60*1000, pendingIntent);
sprawi, że Twój PendingIntent zostanie uruchomiony w ciągu 1 minuty (60 * 1000 milisekund).
Podczas gdy AlarmManager.RTC_WAKEUP jest dla standardowego czasu "ściany" w milisekundach od epoki. Więc,
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
+ 60*10000, pendingIntent);
może również wywołać alarm za 60 sekund od teraz, ale nie niezawodnie, ponieważ jak zaznaczono w dokumentacji SystemClock :
Zegar ścienny może być ustawiany przez użytkownika lub sieć telefoniczną (patrz setCurrentTimeMillis (long)), dzięki czemu czas może przeskakiwać do tyłu lub do przodu w nieprzewidywalny sposób. Tego zegara należy używać tylko wtedy, gdy ważna jest zgodność z rzeczywistymi datami i godzinami, na przykład w aplikacji kalendarza lub budzika. Pomiary interwałów lub czasu, który upłynął, powinny wykorzystywać inny zegar. Jeśli używasz System.currentTimeMillis (), rozważ wysłuchanie transmisji ACTION_TIME_TICK, ACTION_TIME_CHANGED i ACTION_TIMEZONE_CHANGED, aby dowiedzieć się, kiedy zmienia się czas.
Ponadto pytanie odnosiło się tylko do alarmów * _WAKEUP, ale zapoznaj się również z dokumentacją AlarmManager , aby upewnić się, że rozumiesz, co zapewniają alarmy budzenia, a co nie.