AlarmManager: kernbegrippen en werken met alarmen

Auteur: IT Sectr Gepubliceerd: 2026-03-28 Leestijd: 8 min

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 voor het uitvoeren van taken op exacte tijd, die zelfs in slaapstand werkt.
  • Alarmtypen omvatten ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP en RTC_WAKEUP — met en zonder ontwaken.
  • setExact garandeert nauwkeurige activering op Android 4.4+, maar verbruikt meer batterij.
  • setAlarmClock — de enige methode die het systeem gegarandeerd op tijd uitvoert op Android 6+.
  • Vanaf Android 12 is de SCHEDULE_EXACT_ALARM-machtiging vereist voor nauwkeurige alarmen.

Wat is AlarmManager?

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.

Hoe werkt AlarmManager?

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.

Alarmtypen

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.

TypeTijdWektVoorbeeld
ELAPSED_REALTIMEsinds opstartenneewerktijdtimer
RTCUnix timestampneelogboek
ELAPSED_REALTIME_WAKEUPsinds opstartenjaperiodieke taak
RTC_WAKEUPUnix timestampjaalarm

Machtigingen en rechten

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.

Methoden set, setRepeating en setExact

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.

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

Voorbeeld van AlarmManager-gebruik

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.

kotlin
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.

kotlin
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
    )
}

Optimalisatie en aanbevelingen

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.

AlarmManager testen in eenheidstests

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.

Migratie van AlarmManager naar WorkManager

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

BOOT_COMPLETED afhandelen voor herstel van alarmen

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.

kotlin
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

Wat is het verschil tussen setExact en setAlarmClock?

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.

Hoe gedraagt AlarmManager zich na het herstarten van het apparaat?

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.

Waarom wordt setRepeating niet aanbevolen op Android 4.4+?

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.

Welke machtiging is nodig voor nauwkeurige alarmen op Android 12+?

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.

Kan AlarmManager zonder PendingIntent worden gebruikt?

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

  • AlarmManager — Android-systeemservice voor het uitvoeren van taken op exacte tijd met de mogelijkheid het apparaat te wekken.
  • Vier typen alarmen — ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP en RTC_WAKEUP — dekken verschillende scenario's.
  • setExact en setAlarmClock — de enige methoden voor nauwkeurige activering op moderne Android-versies.
  • setRepeating is verouderd op Android 4.4+ — gebruik setExact met handmatige herplanning.
  • SCHEDULE_EXACT_ALARM-machtiging is verplicht op Android 12+ voor nauwkeurige alarmen.
  • WorkManager of JobScheduler hebben de voorkeur voor onnauwkeurige achtergrondtaken zonder tijdsvereiste.
  • Vergeet niet BOOT_COMPLETED af te handelen voor herstel van alarmen na het herstarten van het apparaat.

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.

Bespreek het project

Lees ook