Übermäßige Wakeups

Wakeups sind ein Mechanismus in der AlarmManager API, mit dem Entwickler einen Alarm festlegen können, um ein Gerät zu einer bestimmten Zeit zu wecken. Deine App richtet einen Weckalarm ein, indem sie eine der set()-Methoden in AlarmManager mit dem Flag RTC_WAKEUP oder ELAPSED_REALTIME_WAKEUP aufruft. Wenn ein Weckruf ausgelöst wird, verlässt das Gerät den Energiesparmodus und hält einen partiellen Wakelock, während die Methode onReceive() oder onAlarm() des Weckers ausgeführt wird. Wenn Weckalarme zu häufig ausgelöst werden, können sie den Akku des Geräts entladen.

Zur Verbesserung der App-Qualität prüft Android Apps automatisch auf übermäßige Wakeup-Alarme und zeigt die entsprechenden Informationen in Android Vitals an. Informationen dazu, wie die Daten erhoben werden, findest du in der Play Console-Dokumentation.

Wenn das Gerät durch deine App übermäßig aktiv wird, kannst du mithilfe der Anleitung auf dieser Seite das Problem diagnostizieren und beheben.

Problem beheben

AlarmManager wurde in frühen Versionen der Android-Plattform eingeführt. Im Laufe der Zeit wurden jedoch viele Anwendungsfälle, für die zuvor AlarmManager erforderlich war, durch neuere Funktionen wie WorkManager besser bedient. Dieser Abschnitt enthält Tipps zur Reduzierung von Weckalarmen. Langfristig solltest du deine App gemäß den Empfehlungen im Abschnitt Best Practices migrieren.

Identifizieren Sie die Stellen in Ihrer App, an denen Sie Weckalarme planen, und reduzieren Sie die Häufigkeit, mit der diese Alarme ausgelöst werden. Hier einige Tipps:

  • Suchen Sie nach Aufrufen der verschiedenen set()-Methoden in AlarmManager, die entweder das Flag RTC_WAKEUP oder ELAPSED_REALTIME_WAKEUP enthalten.

  • Wir empfehlen, den Namen des Pakets, der Klasse oder der Methode in den Tag-Namen Ihres Weckers aufzunehmen, damit Sie den Ort in der Quelle leicht identifizieren können, an dem der Alarm gestellt wurde. Hier einige zusätzliche Tipps:

    • Lassen Sie alle personenidentifizierbaren Informationen (PII) im Namen weg, z. B. eine E-Mail-Adresse. Andernfalls protokolliert das Gerät _UNKNOWN anstelle des Alarmnamens.
    • Rufen Sie den Klassen- oder Methodennamen nicht programmatisch ab, z. B. durch Aufrufen von getName(), da er von Proguard verschleiert werden könnte. Verwenden Sie stattdessen einen hartcodierten String.
    • Fügen Sie Alarm-Tags keinen Zähler oder eindeutige IDs hinzu. Das System kann so eingestellte Alarme nicht zusammenfassen, da sie alle eindeutige Kennzeichnungen haben.

Prüfen Sie nach der Behebung des Problems, ob Ihre Weckalarme wie erwartet funktionieren. Führen Sie dazu den folgenden ADB-Befehl aus:

adb shell dumpsys alarm

Dieser Befehl liefert Informationen zum Status des Alarmsystemdienstes auf dem Gerät. Weitere Informationen finden Sie unter dumpsys.

Best Practices

Verwenden Sie Wakeup-Alarme nur dann, wenn Ihre App eine an den Nutzer gerichtete Aktion ausführen muss, z. B. eine Benachrichtigung posten oder den Nutzer benachrichtigen muss. Eine Liste der Best Practices für AlarmManager finden Sie unter Alarme planen.

Verwenden Sie AlarmManager nicht zum Planen von Hintergrundaufgaben, insbesondere wiederkehrende oder Netzwerk-Hintergrundaufgaben. Mit WorkManager können Sie Hintergrundaufgaben planen, da dies folgende Vorteile bietet:

  • Batching – Die Aufträge werden kombiniert, um den Akkuverbrauch zu reduzieren.
  • Persistenz – wenn das Gerät neu gestartet wird, werden geplante WorkManager-Jobs nach Abschluss des Neustarts ausgeführt.
  • Kriterien: Jobs können auf Grundlage bestimmter Bedingungen ausgeführt werden, z. B. ob das Gerät geladen wird oder WLAN verfügbar ist.

Weitere Informationen findest du im Leitfaden zur Hintergrundverarbeitung.

Verwenden Sie AlarmManager nicht zum Planen von Zeitvorgängen, die nur gültig sind, während die App ausgeführt wird. Der Vorgang sollte also abgebrochen werden, wenn der Nutzer die App schließt. Verwenden Sie in diesen Situationen die Klasse Handler, da sie einfacher zu verwenden und wesentlich effizienter ist.