„Genaue Alarme festlegen“ werden standardmäßig abgelehnt

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:

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:

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 Methoden postAtTime() oder postDelayed() 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:

  1. Apps sollten AlarmManager.canScheduleExactAlarms() aufrufen, um zu bestätigen, dass sie die entsprechende Berechtigung hat.
  2. 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.

  3. Achten Sie auf die AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED-Broadcasts, die gesendet werden, wenn der Nutzer die Berechtigung erteilt.

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

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.