AlarmManager — is een Android-systeemservice waarmee apps taken op een bepaald tijdstip kunnen uitvoeren, zelfs als de app niet draait of het apparaat in slaapstand staat. In tegenstelling tot JobScheduler of WorkManager garandeert AlarmManager nauwkeurige activering, wat het onmisbaar maakt voor alarmen, agendaherinneringen en tijdkritische taken. Volgens Android Developers, 2026 gedraagt setRepeating zich vanaf Android 4.4 als een onnauwkeurige herhaling en is setExact of setAlarmClock vereist voor nauwkeurige alarmen.
Belangrijkste punten
AlarmManager — is een Android-systeemservice die een API biedt voor het plannen van taken met nauwkeurige of geschatte uitvoeringstijd. Het bestaat sinds de eerste versie van Android en blijft de enige betrouwbare manier om code op een bepaald moment uit te voeren, ongeacht de staat van de app en het apparaat.
Het werkingsprincipe is eenvoudig: de app stuurt het systeem een PendingIntent met opgave van de activeringstijd. Wanneer het gewenste moment aanbreekt, stuurt het systeem een Intent naar de geregistreerde BroadcastReceiver of start het een Service. Zelfs als het apparaat in slaapstand was, zorgt een WakeLock ervoor dat de processor kan ontwaken en de gebeurtenis kan verwerken.
Het belangrijkste toepassingsgebied van AlarmManager — taken die nauwkeurige tijd vereisen: alarmen, agendaherinneringen, het starten van langdurige bewerkingen op een bepaald uur. Voor taken waarbij nauwkeurigheid niet kritisch is (eenmaal daagse synchronisatie) beveelt Google WorkManager of JobScheduler aan, omdat deze energiezuiniger zijn.
AlarmManager ontvangt van de app een PendingIntent en de activeringstijd. Het systeem slaat dit verzoek op in zijn interne planner en wekt de processor op het opgegeven tijdstip om de Intent af te leveren. De ontwikkelaar moet vooraf een BroadcastReceiver registreren die deze Intent zal verwerken.
AlarmManager ondersteunt 4 alarmtypen: ELAPSED_REALTIME (tijd sinds opstarten, wekt niet), RTC (echte tijd, wekt niet), ELAPSED_REALTIME_WAKEUP (tijd sinds opstarten, wekt het apparaat) en RTC_WAKEUP (echte tijd, wekt). WAKEUP-versies zijn nodig als de taak moet worden uitgevoerd, zelfs wanneer het apparaat slaapt.
| Type | Tijd | Wekt | Voorbeeld |
|---|---|---|---|
| ELAPSED_REALTIME | sinds opstarten | nee | werktijdtimer |
| RTC | Unix timestamp | nee | logboek |
| ELAPSED_REALTIME_WAKEUP | sinds opstarten | ja | periodieke taak |
| RTC_WAKEUP | Unix timestamp | ja | alarm |
Vanaf Android 12 (API 31) is voor het gebruik van nauwkeurige alarmen (setExact) de machtiging SCHEDULE_EXACT_ALARM vereist. De gebruiker kan deze intrekken via de instellingen. Voor apps die een nauwkeurig alarm met weergave nodig hebben (bijvoorbeeld klok), wordt USE_EXACT_ALARM gebruikt, dat bij installatie wordt verleend.
AlarmManager biedt drie hoofdmethoden voor het plannen van taken. De keuze van de methode bepaalt de nauwkeurigheid van de activering en de impact op het energieverbruik van het apparaat.
set — de basismethode voor eenmalige onnauwkeurige activering. Het systeem kan de tijd met enkele minuten verschuiven om te groeperen met andere gebeurtenissen. Geschikt voor taken waarbij nauwkeurigheid niet kritisch is: een herinnering om de app te openen.
setRepeating — de methode voor periodieke herhalingen. Vanaf Android 4.4 (API 19) werd setRepeating onnauwkeurig — intervallen kunnen variëren. Het systeem garandeert geen constante periode meer. In plaats van setRepeating wordt aanbevolen setExact met handmatige herplanning of WorkManager met PeriodicWorkRequest te gebruiken.
setExact — de methode voor eenmalige nauwkeurige activering. Het systeem wekt het apparaat zo dicht mogelijk bij de opgegeven tijd. setAlarmClock — een speciaal geval van setExact, dat ook een alarmericoon in de statusbalk toont en de hoogste prioriteit heeft van alle alarmtypen.
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
// Nauwkeurig eenmalig alarm
val intent = Intent(this, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
this, 0, intent,
PendingIntent.FLAG_IMMUTABLE
)
alarmManager.setAlarmClock(
AlarmManager.AlarmClockInfo(
targetTime, pendingIntent
),
pendingIntent
)
Typisch scenario — het maken van een dagelijkse herinnering op een bepaald tijdstip. Hiervoor wordt RTC_WAKEUP met setExact gebruikt. Bij activering start de BroadcastReceiver een melding of Service. Na verwerking moet de taak voor de volgende dag worden herpland.
class ReminderReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent?) {
val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE)
as NotificationManager
val notification = NotificationCompat.Builder(
context, "reminder_channel"
)
.setContentTitle("Herinnering")
.setContentText("Het is tijd om de taak uit te voeren")
.setSmallIcon(R.drawable.ic_reminder)
.build()
notificationManager.notify(1001, notification)
}
}
Voor dagelijkse herhaling wordt setExact gebruikt met berekening van de volgende activering. In de Intent kunnen vlaggen worden meegegeven voor identificatie van verschillende herinneringstypen. Zorg ervoor dat de BroadcastReceiver is geregistreerd in AndroidManifest.xml met verwerking van de WAKEUP-actie.
fun scheduleDailyReminder(context: Context, hour: Int, minute: Int) {
val calendar = Calendar.getInstance().apply {
set(Calendar.HOUR_OF_DAY, hour)
set(Calendar.MINUTE, minute)
set(Calendar.SECOND, 0)
if (before(Calendar.getInstance())) {
add(Calendar.DAY_OF_MONTH, 1)
}
}
val alarmManager =
context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
pendingIntent
)
}
AlarmManager — een krachtig maar energie-intensief hulpmiddel. Elk WAKEUP-alarm haalt het apparaat uit de slaapstand, wat batterij verbruikt. Google raadt aan het gebruik van nauwkeurige alarmen te minimaliseren en de voorkeur te geven aan setExactAndAllowWhileIdle op Android 6+ om de impact op de Doze-modus te verminderen. Voor periodieke taken zonder nauwkeurigheidseis gebruikt u WorkManager met PeriodicWorkRequest, die het apparaat niet hoeft te wekken en geen batterij verbruikt bij elke uitvoering.
Voor het testen van AlarmManager gebruikt u TestAlarmManager uit het Android Test Framework. Het maakt het mogelijk om alarmactivering te simuleren zonder op de echte tijd te wachten. In Robolectric is ShadowAlarmManager beschikbaar, die aanroepen van set, setExact en setRepeating onderschept en methoden biedt voor geforceerde activering en controle van het aantal geplande taken. Voor eenheidstests van BroadcastReceiver gebruikt u Robolectric.getForegroundScheduler(). Ook is er een Espresso-test met IdlingResource beschikbaar die wacht op alarmactivering in integratietests.
Als uw app AlarmManager gebruikt voor periodieke taken die geen nauwkeurige tijd vereisen, overweeg dan migratie naar WorkManager. PeriodicWorkRequest met een minimuminterval van 15 minuten vervangt setRepeating, terwijl WorkManager uitvoering na herstart garandeert, de Doze-modus afhandelt en geen SCHEDULE_EXACT_ALARM-machtiging vereist. Voor tijdkritische taken (alarm om 7 uur 's ochtends) blijft AlarmManager de enige juiste keuze. De optimale strategie — gebruik AlarmManager alleen voor alarmen met setAlarmClock en verplaats alle andere achtergrondtaken naar WorkManager.
Voor periodieke taken zonder nauwkeurigheidseis gebruikt u WorkManager met PeriodicWorkRequest. Voor taken met nauwkeurige tijd maar niet kritisch voor activering in slaapstand — setExact zonder WAKEUP. En alleen voor alarmen met verplicht ontwaken — setAlarmClock of RTC_WAKEUP.
Het is ook belangrijk om de aanwezigheid van de SCHEDULE_EXACT_ALARM-machtiging op Android 12+ te controleren. Als de machtiging niet is verleend, werkt setExact als een gewone set (onnauwkeurig). Gebruik AlarmManager.canScheduleExactAlarms() om te controleren. Bij afwezigheid van de machtiging kunt u de gebruiker voorstellen om naar de instellingen te gaan via Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM).
Een kritisch belangrijke eigenschap van AlarmManager — alle geplande alarmen worden gereset na het herstarten van het apparaat. Voor herstel moet u een BroadcastReceiver declareren die Intent.ACTION_BOOT_COMPLETED verwerkt en alle actieve alarmen opnieuw plannen in de onReceive-methode. Zonder dit verliest de gebruiker alle herinneringen na het uitschakelen en inschakelen van de telefoon.
class BootReceiver : BroadcastReceiver() {
override fun onReceive(
context: Context,
intent: Intent
) {
if (intent.action ==
Intent.ACTION_BOOT_COMPLETED
) {
val prefs =
context.getSharedPreferences("alarms", 0)
val savedTime =
prefs.getLong("next_alarm", 0L)
if (savedTime > System.currentTimeMillis()) {
scheduleReminder(context, savedTime)
}
}
}
}
In de praktijk blijft AlarmManager de beste oplossing voor alarmapps, agenda's, medicijnherinneringen en alle taken waarbij de activeringstijd kritisch is voor de gebruiker. Voor alle andere achtergrondwerkscenario's hebben WorkManager of JobScheduler de voorkeur.
Kies tussen AlarmManager en WorkManager volgens de regel: als de gebruiker expliciet om een herinnering om 14:30 heeft gevraagd — gebruik AlarmManager met setAlarmClock. Als de taak „ongeveer eenmaal per uur" moet worden uitgevoerd — WorkManager met PeriodicWorkRequest is energiezuiniger en betrouwbaarder.
Veelgestelde vragen
Beide methoden garanderen nauwkeurige activering, maar setAlarmClock toont bovendien een alarmericoon in de statusbalk en informeert het systeem dat dit een alarm voor de gebruiker is. Op Android 6+ heeft setAlarmClock immuniteit tegen de Doze-modus, terwijl setExact kan worden uitgesteld.
Na het herstarten worden alle geplande alarmen gereset. Voor herstel moet u een BroadcastReceiver registreren voor de BOOT_COMPLETED-actie en alle taken opnieuw plannen in onReceive. Zonder dit werkt geen enkel alarm na het inschakelen van het apparaat.
Vanaf API 19 werd setRepeating onnauwkeurig — het systeem kan intervallen verschuiven om energie te besparen. Gebruik in plaats daarvan setExact met handmatige herplanning of WorkManager met PeriodicWorkRequest, die voorspelbaarder gedrag biedt.
Voor setExact is de machtiging SCHEDULE_EXACT_ALARM vereist, die de gebruiker kan verlenen of intrekken in de instellingen. Voor setAlarmClock met weergave in de klokinterface wordt USE_EXACT_ALARM gebruikt, die automatisch wordt verleend bij installatie uit de winkel.
Nee, AlarmManager werkt altijd via PendingIntent. Dit kan PendingIntent.getBroadcast zijn voor BroadcastReceiver, PendingIntent.getService voor Service of PendingIntent.getActivity voor Activity. Zonder PendingIntent kan het systeem de gebeurtenis niet aan de app leveren.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook