Übermäßige Wakeups

Wakeups sind ein Mechanismus im AlarmManager API, die können Entwickler einen Wecker stellen, um ein Gerät zu einer bestimmten Zeit zu wecken. Ihre App richtet einen Wecker ein, indem er eine der set()-Methoden in AlarmManager mit entweder die RTC_WAKEUP oder ELAPSED_REALTIME_WAKEUP . Wenn ein Weckruf ausgelöst wird, verlässt das Gerät den Energiesparmodus. und hält einen partiellen Wakelock, während der Alarm onReceive() oder onAlarm() . Werden Alarme übermäßig oft ausgelöst, können sie den Akku.

Damit du die App-Qualität verbessern kannst, prüft Android Apps automatisch auf und zeigt die Informationen in Android Vitals an. Für Informationen dazu, wie die Daten erhoben werden, findest du in der Play Console. Dokumentation.

Wenn das Gerät durch deine App übermäßig aktiviert wird, kannst du die Anleitung unter um das Problem zu diagnostizieren und zu beheben.

Problem beheben

Der AlarmManager war in frühen Versionen der Android-Plattform eingeführt, aber im Laufe der Zeit die früher erforderlich waren, AlarmManager sind jetzt neueren Funktionen wie WorkManager Dieser Abschnitt enthält Tipps zum Reduzieren von Weckrufen. Langfristig Sie sollten Ihre App migrieren, um die Empfehlungen in den bestmöglichen Best Practices.

Erkenne die Stellen in deiner App, an denen du Weckrufe einstellen und Häufigkeit, mit der diese Alarme ausgelöst werden. Hier einige Tipps:

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

  • Wir empfehlen, den Namen Ihres Pakets, Ihrer Klasse oder Ihrer Methode im Tag Ihres Weckers anzugeben. Namen, damit Sie die Stelle in Ihrer Quelle leicht identifizieren können, an der die Wecker wurde gestellt. Hier einige zusätzliche Tipps:

    • Lassen Sie im Namen alle personenidentifizierbaren Informationen weg, zum Beispiel eine E-Mail-Adresse. Andernfalls protokolliert das Gerät _UNKNOWN anstelle des Alarms Namen.
    • Sie sollten den Klassen- oder Methodennamen nicht programmatisch abrufen, z. B. durch den Aufruf von getName(), weil könnte es von Proguard verschleiert werden. Verwenden Sie stattdessen einen hartcodierten String.
    • Fügen Sie Alarm-Tags keinen Zähler oder eindeutige IDs hinzu. Das System zeigt keine so eingestellte Alarme aggregieren, da sie alle eindeutige IDs.

Nachdem du das Problem behoben hast, überprüfe, ob deine Weckrufe funktionieren dies wird erwartet, wenn Sie den folgenden ADB-Befehl ausführen Befehl:

adb shell dumpsys alarm

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

Best Practices

Verwende Wakeup-Alarme nur, wenn deine App eine für den Nutzer sichtbare Aktion ausführen muss (z. B. eine Benachrichtigung posten oder den Nutzer benachrichtigen). Eine Liste mit Best Practices für AlarmManager, siehe Planung Wecker.

Nicht verwenden AlarmManager bis Sie planen Hintergrundaufgaben, insbesondere wiederkehrende oder Netzwerkaufgaben. Verwenden Sie WorkManager zu planen, da dies folgende Vorteile bietet:

  • Batchverarbeitung: Jobs werden kombiniert, um den Akkuverbrauch zu reduzieren.
  • Persistenz – nach Neustart des Geräts WorkManager-Jobs geplant nach Abschluss des Neustarts ausführen
  • Kriterien: Jobs können basierend auf Bedingungen ausgeführt werden, z. B. danach, ob das Gerät wird geladen oder WLAN ist verfügbar

Weitere Informationen findest du im Leitfaden zur Hintergrundverarbeitung.

AlarmManager nicht verwenden um zeitliche Vorgänge zu planen, die nur gültig sind, während die App ausgeführt wird (in Mit anderen Worten: Der Timing-Vorgang sollte abgebrochen werden, wenn der Nutzer die App). Verwenden Sie in diesen Fällen die Methode Handler-Klasse, weil dieser einfacher und effizienter nutzen können.