Exakte Alarme sind für vom Nutzer beabsichtigte Benachrichtigungen oder Aktionen gedacht, die zu einem bestimmten Zeitpunkt erfolgen müssen.
SCHEDULE_EXACT_ALARM
, die in Android 12 eingeführte Berechtigung für Apps zur Planung exakter Alarme, wird den meisten neu installierten Apps, die auf Android 13 und höher ausgerichtet sind, nicht mehr vorab gewährt (standardmäßig auf „abgelehnt“). Wenn der Nutzer App-Daten über einen Sicherungs- und Wiederherstellungsvorgang auf ein Gerät mit Android 14 überträgt, wird die Berechtigung trotzdem verweigert. Wenn eine vorhandene App diese Berechtigung bereits hat, wird sie beim Upgrade auf Android 14 vorab gewährt.
Die Berechtigung SCHEDULE_EXACT_ALARM
ist erforderlich, um exakte Alarme über die folgenden APIs auszulösen. Andernfalls wird ein SecurityException
ausgelöst:
Es gelten weiterhin die bestehenden Best Practices für die Berechtigung SCHEDULE_EXACT_ALARM
:
- Prüfe die Berechtigung bei
canScheduleExactAlarms()
, bevor du exakte Alarme planst. - Richte deine App so ein, dass sie auf die Übertragung
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
im Vordergrund reagiert, die das System sendet, wenn der Nutzer die Berechtigung erteilt.
Betroffene Apps
Wenn auf einem Gerät Android 14 oder höher ausgeführt wird, wirkt sich diese Änderung auf eine neu installierte App mit den folgenden Eigenschaften aus:
- Ist auf Android 13 (API-Level 33) oder höher ausgerichtet.
- Deklariert die Berechtigung
SCHEDULE_EXACT_ALARM
im Manifest. - Fällt nicht unter die Ausnahme oder das Szenario vor einer Erteilung.
- Ist keine Kalender- oder Wecker-App.
Kalender- und Wecker-Apps müssen Folgendes deklarieren: USE_EXACT_ALARM
Kalender- oder Wecker-Apps müssen Kalendererinnerungen, Wecker oder Benachrichtigungen senden, wenn die App nicht mehr ausgeführt wird. Diese Apps können die normale USE_EXACT_ALARM
-Berechtigung anfordern. Die Berechtigung USE_EXACT_ALARM
wird bei der Installation gewährt und Apps mit dieser Berechtigung können genau wie Apps mit der Berechtigung SCHEDULE_EXACT_ALARM
genaue Alarme planen.
Anwendungsfälle, bei denen möglicherweise kein exakter Alarm erforderlich ist
Da die Berechtigung SCHEDULE_EXACT_ALARM
jetzt standardmäßig abgelehnt wird und die Erteilung von Berechtigungen zusätzliche Schritte von Nutzern erfordert, wird Entwicklern dringend empfohlen, ihre Anwendungsfälle zu bewerten und festzustellen, ob genaue Alarme für ihre Anwendungsfälle noch sinnvoll sind.
Die folgende Liste zeigt gängige Workflows, bei denen kein exakter Alarm erforderlich ist:
- Wiederholte Aufgaben während der gesamten Lebensdauer Ihrer App planen
- Die Methode
set()
ist nützlich, wenn bei der Aufgabe Echtzeiteinschränkungen berücksichtigt werden müssen, z. B. das Ereignis in 30 Minuten um 14:00 Uhr morgens oder in 30 Minuten. Andernfalls empfiehlt es sich, stattdessen die MethodenpostAtTime()
oderpostDelayed()
zu verwenden. - Geplante Hintergrundarbeiten wie das Aktualisieren der App und das Hochladen von Protokollen
- Mit
WorkManager
können Sie zeitkritische Aufgaben planen. Sie können ein Wiederholungsintervall und flexInterval (mindestens 15 Minuten) angeben, um eine detaillierte Laufzeit für die Arbeit zu definieren. - Der Alarm soll zu einer ungefähren Zeit ausgelöst werden, während das System inaktiv ist.
- Einen ungenauen Wecker verwenden. Rufen Sie insbesondere
setAndAllowWhileIdle()
auf. - Vom Nutzer angegebene Aktion, die nach einer bestimmten Zeit erfolgen soll
- Einen ungenauen Wecker verwenden. Rufen Sie insbesondere
set()
auf. - Vom Nutzer angegebene Aktion, die innerhalb eines Zeitfensters ausgeführt werden kann
- Einen ungenauen Wecker verwenden. Rufen Sie insbesondere
setWindow()
auf. Beachten Sie, dass die kleinste zulässige Fensterlänge 10 Minuten beträgt.
Migrationsschritte zur weiteren Verwendung exakter Alarme
Zumindest müssen Apps überprüfen, ob sie dazu berechtigt sind, bevor exakte Alarme geplant werden können. Wenn Apps diese Berechtigung nicht haben, müssen sie sie vom Nutzer anfordern, indem sie einen Intent aufrufen.
Dies entspricht dem Standardworkflow zum Anfordern einer speziellen Berechtigung:
- Apps sollten
AlarmManager.canScheduleExactAlarms()
aufrufen, um zu bestätigen, dass sie die entsprechende Berechtigung hat. Wenn die App diese Berechtigung nicht hat, rufen Sie einen Intent auf, der
ACTION_REQUEST_SCHEDULE_EXACT_ALARM
und den Paketnamen der App enthält, um Nutzer um die Erteilung der Berechtigung zu bitten.Prüfe die Entscheidung des Nutzers in der Methode
onResume()
deiner App.Achten Sie auf die
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
-Broadcasts, die gesendet werden, wenn der Nutzer die Berechtigung erteilt.Wenn der Nutzer die Berechtigung für Ihre App erteilt hat, kann Ihre App exakte Alarme einstellen. Wenn der Nutzer stattdessen die Berechtigung verweigert hat, sorgen Sie dafür, dass die Nutzung der Anwendung nicht wie vorgesehen funktioniert, sodass dem Nutzer Funktionen ohne die Informationen zur Verfügung stehen, die durch diese Berechtigung geschützt sind.
Im folgenden Code-Snippet wird gezeigt, wie die Berechtigung SCHEDULE_EXACT_ALARM
geprüft wird:
val alarmManager: AlarmManager = context.getSystemService<AlarmManager>()!!
when {
// If permission is granted, proceed with scheduling exact alarms.
alarmManager.canScheduleExactAlarms() -> {
alarmManager.setExact(...)
}
else -> {
// Ask users to go to exact alarm page in system settings.
startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
}
}
Beispielcode zum Prüfen der Berechtigung und zum Verarbeiten der Nutzerentscheidungen in onResume()
:
override fun onResume() {
…
if (alarmManager.canScheduleExactAlarms()) {
// Set exact alarms.
alarmManager.setExact(...)
}
else {
// Permission not yet approved. Display user notice and revert to a fallback
// approach.
alarmManager.setWindow(...)
}
}
Graceful Degradation bei Berechtigungsverweigerung
Einige Nutzer lehnen die Berechtigung ab. In diesem Szenario empfehlen wir, Apps so zu gestalten, dass sie die Nutzerfreundlichkeit vollständig herabstufen und gleichzeitig die bestmögliche Fallback-Nutzung ermöglichen, indem sie ihre Anwendungsfälle identifizieren.
Ausnahmen
Die folgenden Arten von Apps dürfen die Methoden setExact()
oder setExactAndAllowWhileIdle()
immer aufrufen:
- Apps, die mit dem Plattformzertifikat signiert sind
- Privilegierte Apps
- Apps, die auf der Zulassungsliste stehen. Wenn Ihre App die Anforderungen erfüllt, können Sie dies mit der Intent-Aktion
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
anfordern.
Vorab erteilte Erteilungen
- Rolleninhabern von
SYSTEM_WELLBEING
wirdSCHEDULE_EXACT_ALARM
vorab gewährt.
Testrichtlinien
Um diese Änderung zu testen, deaktivieren Sie die Berechtigung Wecker und Erinnerungen für Ihre App auf der Seite Spezieller App-Zugriff in den Systemeinstellungen (Einstellungen > Apps > Spezieller App-Zugriff > Wecker und Erinnerungen) und beobachten Sie das Verhalten Ihrer App.