Wakeups sind ein Mechanismus in der AlarmManager API, mit dem Entwickler einen Alarm einstellen können, um ein Gerät zu einer bestimmten Zeit zu aktivieren. Ihre App stellt einen Wecker, indem sie eine der set()-Methoden in AlarmManager mit dem Flag RTC_WAKEUP oder ELAPSED_REALTIME_WAKEUP aufruft. Wenn ein Weckalarm ausgelöst wird, wird das Gerät aus dem Energiesparmodus reaktiviert und hält einen partiellen Wakelock, während die Methode onReceive() oder onAlarm() des Alarms ausgeführt wird. Wenn Weckalarme zu häufig ausgelöst werden, kann das den Akku eines Geräts entladen.
Wenn Ihre App das Gerät übermäßig oft aktiviert, können Sie das Problem mithilfe der Informationen auf dieser Seite diagnostizieren und beheben.
Problem beheben
Der 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 ersetzt.
Dieser Abschnitt enthält Tipps zum Reduzieren von Weckalarmen. Langfristig sollten Sie Ihre App jedoch so migrieren, dass sie den Empfehlungen im Abschnitt Best Practices entspricht.
Ermitteln 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 in
AlarmManagernach Aufrufen der verschiedenenset()-Methoden, die entweder das FlagRTC_WAKEUPoderELAPSED_REALTIME_WAKEUPenthalten.Wir empfehlen, den Paket-, Klassen- oder Methodennamen in den Tagnamen des Alarms aufzunehmen, damit Sie die Stelle in Ihrem Quellcode, an der der Alarm festgelegt wurde, leicht identifizieren können. Hier sind einige zusätzliche Tipps:
- Lassen Sie alle personenidentifizierbaren Informationen (PII) im Namen weg, z. B. eine E‑Mail-Adresse. Andernfalls wird im Gerät
_UNKNOWNanstelle des Alarmnamens protokolliert. - 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 fest codierten String. - Fügen Sie Alarm-Tags keinen Zähler oder keine eindeutigen Kennungen hinzu. Das System kann so eingestellte Wecker nicht zusammenfassen, da sie alle eindeutige Kennungen haben.
- Lassen Sie alle personenidentifizierbaren Informationen (PII) im Namen weg, z. B. eine E‑Mail-Adresse. Andernfalls wird im Gerät
Nachdem Sie das Problem behoben haben, prüfen Sie mit dem folgenden ADB-Befehl, ob Ihre Weckalarme wie erwartet funktionieren:
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 Weckalarme nur, wenn Ihre App eine nutzerorientierte Aktion ausführen muss, z. B. eine Benachrichtigung senden oder den Nutzer benachrichtigen. Eine Liste mit Best Practices für AlarmManager finden Sie unter Alarme planen.
Verwenden Sie AlarmManager nicht, um Hintergrundaufgaben zu planen, insbesondere sich wiederholende oder Netzwerk-Hintergrundaufgaben. Verwenden Sie WorkManager, um Hintergrundaufgaben zu planen, da dies die folgenden Vorteile bietet:
- Batching: Jobs 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 von Bedingungen ausgeführt werden, z. B. ob das Gerät geladen wird oder WLAN verfügbar ist.
Weitere Informationen finden Sie im Leitfaden zur Hintergrundverarbeitung.
Verwenden Sie AlarmManager nicht, um Zeitvorgänge zu planen, die nur gültig sind, wenn die App ausgeführt wird. Der Zeitvorgang sollte also abgebrochen werden, wenn der Nutzer die App beendet. Verwenden Sie in diesen Fällen die Klasse Handler, da sie einfacher zu verwenden und viel effizienter ist.
Empfehlungen für Sie
- Hinweis: Linktext wird angezeigt, wenn JavaScript deaktiviert ist
- Hängende Teil-Wakelocks
- ANRs