AlarmManager ist ein Android-Systemdienst, der es Anwendungen ermöglicht, Aufgaben zu einer bestimmten Zeit auszuführen, selbst wenn die Anwendung nicht läuft oder sich das Gerät im Schlafmodus befindet. Im Gegensatz zu JobScheduler oder WorkManager garantiert AlarmManager eine präzise Auslösung, was ihn für Alarme, Kalendererinnerungen und zeitkritische Aufgaben unverzichtbar macht. Laut Android Developers, 2026 verhält sich setRepeating ab Android 4.4 wie eine ungenaue Wiederholung, und für präzise Alarme sind setExact oder setAlarmClock erforderlich.
Wichtige Punkte
AlarmManager ist ein Android-Systemdienst, der eine API zum Planen von Aufgaben mit präziser oder ungefährer Ausführungszeit bereitstellt. Es existiert seit der ersten Android-Version und bleibt die einzige zuverlässige Möglichkeit, Code zu einem bestimmten Zeitpunkt auszuführen, unabhängig vom Zustand der Anwendung und des Geräts.
Das Funktionsprinzip ist einfach: Die Anwendung sendet dem System einen PendingIntent mit der geplanten Auslösezeit. Wenn die angegebene Zeit erreicht ist, sendet das System den Intent an einen registrierten BroadcastReceiver oder startet einen Service. Selbst wenn sich das Gerät im Schlafmodus befand, ermöglicht WakeLock dem Prozessor, aufzuwachen und das Ereignis zu verarbeiten.
Der Hauptanwendungsbereich von AlarmManager sind Aufgaben, die eine präzise Zeitsteuerung erfordern: Alarme, Kalendererinnerungen, Start langlaufender Operationen zu einer bestimmten Stunde. Für Aufgaben, bei denen Genauigkeit nicht kritisch ist (tägliche Synchronisierung), empfiehlt Google WorkManager oder JobScheduler, da diese energieeffizienter sind.
AlarmManager empfängt von der Anwendung einen PendingIntent und eine Auslösezeit. Das System speichert diese Anfrage in seinem internen Planer und weckt den Prozessor zur angegebenen Zeit auf, um den Intent zuzustellen. Der Entwickler muss im Voraus einen BroadcastReceiver registrieren, der diesen Intent verarbeitet.
AlarmManager unterstützt 4 Alarmtypen: ELAPSED_REALTIME (Zeit seit dem Booten, weckt nicht), RTC (Echtzeit, weckt nicht), ELAPSED_REALTIME_WAKEUP (Zeit seit dem Booten, weckt das Gerät) und RTC_WAKEUP (Echtzeit, weckt). WAKEUP-Versionen sind notwendig, wenn die Aufgabe auch dann ausgeführt werden muss, wenn das Gerät schläft.
| Typ | Zeit | Weckt | Beispiel |
|---|---|---|---|
| ELAPSED_REALTIME | seit Boot | nein | Betriebszeitzähler |
| RTC | Unix-Zeitstempel | nein | Protokollierung |
| ELAPSED_REALTIME_WAKEUP | seit Boot | ja | periodische Aufgabe |
| RTC_WAKEUP | Unix-Zeitstempel | ja | Wecker |
Ab Android 12 (API 31) ist für die Verwendung präziser Alarme (setExact) die Berechtigung SCHEDULE_EXACT_ALARM erforderlich. Der Benutzer kann sie über die Einstellungen widerrufen. Für Anwendungen, die einen präzisen Alarm mit Anzeige benötigen (z. B. Uhren-Apps), wird USE_EXACT_ALARM verwendet, das bei der Installation erteilt wird.
AlarmManager bietet drei Hauptmethoden zum Planen von Aufgaben. Die Wahl der Methode bestimmt die Auslösegenauigkeit und die Auswirkungen auf den Stromverbrauch des Geräts.
set — die Basismethode für eine einmalige ungenaue Auslösung. Das System kann die Zeit um bis zu einigen Minuten verschieben, um sie mit anderen Ereignissen zu gruppieren. Geeignet für Aufgaben, bei denen Genauigkeit nicht kritisch ist: Erinnerungen zum Öffnen der Anwendung.
setRepeating — eine Methode für periodische Wiederholungen. Seit Android 4.4 (API 19) ist setRepeating ungenau geworden — die Intervalle können variieren. Das System garantiert keine konstante Periode mehr. Anstelle von setRepeating wird empfohlen, setExact mit Neuplanung oder WorkManager mit PeriodicWorkRequest zu verwenden.
setExact — eine Methode für präzise einmalige Auslösung. Das System weckt das Gerät so nah wie möglich an der angegebenen Zeit auf. setAlarmClock ist ein Sonderfall von setExact, der auch ein Alarmsymbol in der Statusleiste anzeigt und die höchste Priorität unter allen Alarmtypen hat.
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
// Präziser einmaliger 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
)
Ein typisches Szenario ist die Erstellung einer täglichen Erinnerung zu einer bestimmten Zeit. Dazu wird RTC_WAKEUP mit setExact verwendet. Bei Auslösung startet der BroadcastReceiver eine Benachrichtigung oder einen Service. Nach der Verarbeitung muss die Aufgabe für den nächsten Tag neu geplant werden.
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("Erinnerung")
.setContentText("Zeit, die Aufgabe zu erledigen")
.setSmallIcon(R.drawable.ic_reminder)
.build()
notificationManager.notify(1001, notification)
}
}
Für die tägliche Wiederholung wird setExact mit Berechnung der nächsten Auslösezeit verwendet. Im Intent können Flags zur Identifizierung verschiedener Erinnerungstypen übergeben werden. Stellen Sie sicher, dass der BroadcastReceiver in der AndroidManifest.xml mit WAKEUP-Aktionsbehandlung registriert ist.
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 ist ein leistungsstarkes, aber stromhungriges Werkzeug. Jeder WAKEUP-Alarm holt das Gerät aus dem Schlafmodus und verbraucht Akkuleistung. Google empfiehlt, die Verwendung präziser Alarme zu minimieren und auf Android 6+ setExactAndAllowWhileIdle zu bevorzugen, um die Auswirkungen auf den Doze Mode zu reduzieren. Für periodische Aufgaben ohne Genauigkeitsanforderungen verwenden Sie WorkManager mit PeriodicWorkRequest, der kein Aufwecken des Geräts erfordert und bei jeder Ausführung keinen Akku verbraucht.
Zum Testen von AlarmManager verwenden Sie TestAlarmManager aus dem Android Test Framework. Es ermöglicht die Emulation von Alarmauslösungen ohne Warten auf Echtzeit. Robolectric bietet ShadowAlarmManager, der set-, setExact- und setRepeating-Aufrufe abfängt und Methoden zur erzwungenen Auslösung und Überprüfung der Anzahl geplanter Aufgaben bereitstellt. Für Unit-Tests von BroadcastReceiver verwenden Sie Robolectric.getForegroundScheduler(). Espresso-Tests mit IdlingResource, die auf die Alarmauslösung in Integrationstests warten, sind ebenfalls verfügbar.
Wenn Ihre Anwendung AlarmManager für periodische Aufgaben verwendet, die keine präzise Zeitsteuerung erfordern, ziehen Sie eine Migration zu WorkManager in Betracht. PeriodicWorkRequest mit einem Mindestintervall von 15 Minuten ersetzt setRepeating, während WorkManager die Ausführung nach einem Neustart garantiert, Doze Mode handhabt und keine SCHEDULE_EXACT_ALARM-Berechtigung benötigt. Für zeitkritische Aufgaben (Wecker um 7 Uhr) bleibt AlarmManager die einzig richtige Wahl. Die optimale Strategie ist, AlarmManager nur für Alarme mit setAlarmClock zu verwenden und alle anderen Hintergrundaufgaben zu WorkManager zu verschieben.
Für periodische Aufgaben ohne Genauigkeitsanforderungen verwenden Sie WorkManager mit PeriodicWorkRequest. Für Aufgaben mit präziser Zeitsteuerung, die aber nicht kritisch für die Auslösung im Schlafmodus sind — verwenden Sie setExact ohne WAKEUP. Und nur für Alarme mit zwingendem Aufwecken — verwenden Sie setAlarmClock oder RTC_WAKEUP.
Es ist auch wichtig, die SCHEDULE_EXACT_ALARM-Berechtigung unter Android 12+ zu überprüfen. Wenn die Berechtigung nicht erteilt wurde, funktioniert setExact wie normales set (ungenau). Verwenden Sie AlarmManager.canScheduleExactAlarms() zur Überprüfung. Fehlt die Berechtigung, können Sie den Benutzer über Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM) auffordern, zu den Einstellungen zu gehen.
Ein kritisch wichtiges Merkmal von AlarmManager — alle geplanten Alarme werden nach einem Geräteneustart zurückgesetzt. Um sie wiederherzustellen, müssen Sie einen BroadcastReceiver deklarieren, der Intent.ACTION_BOOT_COMPLETED verarbeitet, und alle aktiven Alarme in der onReceive-Methode neu planen. Ohne dies verliert der Benutzer alle Erinnerungen nach dem Ausschalten und Wiedereinschalten des Telefons.
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 der Praxis bleibt AlarmManager die beste Lösung für Wecker-Anwendungen, Kalender, Medikamentenerinnerungen und alle Aufgaben, bei denen die Ausführungszeit für den Benutzer kritisch ist. Für alle anderen Hintergrundarbeitsszenarien sind WorkManager oder JobScheduler zu bevorzugen.
Bei der Wahl zwischen AlarmManager und WorkManager befolgen Sie diese Regel: Wenn der Benutzer ausdrücklich um eine Erinnerung um 14:30 Uhr gebeten hat — verwenden Sie AlarmManager mit setAlarmClock. Wenn die Aufgabe „ungefähr einmal pro Stunde“ ausgeführt werden soll — ist WorkManager mit PeriodicWorkRequest energieeffizienter und zuverlässiger.
Häufig gestellte Fragen
Beide Methoden garantieren eine präzise Auslösung, aber setAlarmClock zeigt zusätzlich ein Alarmsymbol in der Statusleiste an und informiert das System, dass es sich um einen Benutzeralarm handelt. Unter Android 6+ hat setAlarmClock Immunität gegenüber dem Doze Mode, während setExact verzögert werden kann.
Nach einem Neustart werden alle geplanten Alarme zurückgesetzt. Um sie wiederherzustellen, müssen Sie einen BroadcastReceiver für die Aktion BOOT_COMPLETED registrieren und alle Aufgaben in onReceive neu planen. Ohne dies wird nach dem Einschalten des Geräts kein Alarm ausgelöst.
Seit API 19 ist setRepeating ungenau geworden — das System kann Intervalle zur Energieeinsparung verschieben. Verwenden Sie stattdessen setExact mit manueller Neuplanung oder WorkManager mit PeriodicWorkRequest, der ein vorhersagbareres Verhalten bietet.
Für setExact ist die Berechtigung SCHEDULE_EXACT_ALARM erforderlich, die der Benutzer in den Einstellungen erteilen oder widerrufen kann. Für setAlarmClock mit Uhrenanzeige wird USE_EXACT_ALARM verwendet, das bei der Installation aus dem Store automatisch erteilt wird.
Nein, AlarmManager arbeitet immer über PendingIntent. Dies kann PendingIntent.getBroadcast für BroadcastReceiver, PendingIntent.getService für Service oder PendingIntent.getActivity für Activity sein. Ohne PendingIntent kann das System das Ereignis nicht an die Anwendung zustellen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch