Standort für Akku optimieren

Die in Android 8.0 (API-Level 26) eingeführten Limits für die Standortermittlung im Hintergrund (API-Level 26) beleuchten nun wieder, wie sich die Nutzung von Standortdiensten auf eine schnelle Akkuentladung auswirkt. Auf dieser Seite finden Sie einige Best Practices für Standortdienste. Außerdem erfahren Sie, was Sie jetzt tun können, um den Akku in Ihren Apps zu schonen. Diese Best Practices haben Vorteile für Ihre App, unabhängig von der Plattformversion, auf der sie ausgeführt wird.

Mit den Beschränkungen für die Standortermittlung im Hintergrund in Android 8.0 wurden folgende Änderungen eingeführt:

  • Die Standorterfassung im Hintergrund wird gedrosselt und der Standort wird berechnet und nur wenige Male pro Stunde bereitgestellt.
  • WLAN-Scans sind konservativer und Standortaktualisierungen werden nicht berechnet, wenn das Gerät mit demselben statischen Zugangspunkt verbunden bleibt.
  • Die Reaktionszeit des Geofencings ändert sich von zehn Sekunden auf etwa zwei Minuten. Durch diese Änderung wird die Akkuleistung deutlich verbessert – auf einigen Geräten bis zu zehnmal besser.

Auf dieser Seite wird davon ausgegangen, dass Sie die Google Location Services APIs verwenden, die eine höhere Genauigkeit bieten und den Akku entlasten, als die Framework Location APIs. Dabei wird insbesondere davon ausgegangen, dass Sie mit der Anbieter für kombinierte Standortbestimmung vertraut sind, die Signale von GPS, WLAN und Mobilfunknetzen sowie Beschleunigungsmesser, Gyroskop, Magnetometer und anderen Sensoren kombiniert. Außerdem sollten Sie mit der Geofencing API vertraut sein, die auf der API des Anbieters für kombinierte Standortbestimmung basiert und für Akkuleistung optimiert ist.

Informationen zur schnellen Akkuentladung

Die Standortermittlung und der schnelle Akkuentladung stehen in einem direkten Zusammenhang mit folgenden Aspekten:

  • Genauigkeit: Die Genauigkeit der Standortdaten. Allgemein gilt: Je höher die Genauigkeit, desto stärker entlädt sich der Akku.
  • Häufigkeit: Häufigkeit, mit der der Standort berechnet wird. Je häufiger der Standort berechnet wird, desto höher ist der Akkuverbrauch.
  • Latenz: Hier legen Sie fest, wie schnell Standortdaten bereitgestellt werden. Eine geringere Latenz erfordert in der Regel mehr Akku.

Richtigkeit

Sie können die Standortgenauigkeit mit der Methode setPriority() angeben. Dazu übergeben Sie einen der folgenden Werte als Argument:

  • PRIORITY_HIGH_ACCURACY bietet den genauesten Standort, der mit so vielen Eingaben wie nötig berechnet wird. Dazu werden GPS, WLAN und Mobilfunk verwendet und eine Vielzahl von Sensoren verwendet. Dies kann zu einer erheblichen Entladung des Akkus führen.
  • PRIORITY_BALANCED_POWER_ACCURACY bietet einen genauen Standort und wird gleichzeitig für die Stromversorgung optimiert. Verwendet sehr selten GPS. Zur Berechnung des Gerätestandorts wird in der Regel eine Kombination aus WLAN- und Mobilfunkdaten verwendet.
  • PRIORITY_LOW_POWER stützt sich größtenteils auf Mobilfunkmasten und vermeidet GPS- und WLAN-Eingaben. Dies ermöglicht eine grobe Genauigkeit (auf Stadtebene) bei minimaler Akkuentladung.
  • PRIORITY_NO_POWER empfängt Standorte passiv von anderen Anwendungen, für die der Standort bereits berechnet wurde.

Die Standortanforderungen der meisten Apps können mit einer ausbalancierten Stromversorgung oder einer Option mit geringem Energieverbrauch erfüllt werden. Eine hohe Genauigkeit sollte Anwendungen im Vordergrund vorbehalten sein, die Echtzeit-Standortaktualisierungen erfordern (z. B. eine Karten-App).

Frequenz

Es gibt zwei Möglichkeiten, die Häufigkeit des Standorts festzulegen:

  • Verwenden Sie die Methode setinterval(), um das Intervall anzugeben, in dem der Standort für Ihre App berechnet wird.
  • Mit setFastestInterval() kannst du das Intervall angeben, in dem der für andere Anwendungen berechnete Standort an deine App gesendet wird.

Wenn Sie setInterval() verwenden, sollten Sie den größtmöglichen Wert übergeben. Dies gilt insbesondere für die Erfassung der Standortermittlung im Hintergrund, die häufig eine Ursache für eine unerwünschte Entladung des Akkus ist. Intervalle von einigen Sekunden sollten nur für Anwendungsfälle im Vordergrund verwendet werden. Die in Android 8.0 eingeführten Limits für die Standortermittlung im Hintergrund erzwingen diese Strategien. Ihre App sollte jedoch versuchen, sie auf Geräten mit Android 7.0 oder niedriger zu erzwingen.

Latenz

Sie können die Latenz mit der Methode setMaxWaitTime() angeben. Dabei wird in der Regel ein Wert übergeben, der um ein Vielfaches größer als das in der Methode setInterval() angegebene Intervall ist. Mit dieser Einstellung wird die Standortübermittlung verzögert. Außerdem können mehrere Standortaktualisierungen in Batches übermittelt werden. Diese beiden Änderungen tragen dazu bei, den Akkuverbrauch zu minimieren.

Wenn Ihre App nicht sofort eine Standortaktualisierung benötigt, sollten Sie den größtmöglichen Wert an die Methode setMaxWaitTime() übergeben und so die Latenz gegen mehr Daten- und Akkueffizienz eintauschen.

Bei der Verwendung von Geofencings sollten Anwendungen einen großen Wert an die Methode setNotificationResponsiveness() übergeben, um den Akku zu schonen. Wir empfehlen einen Wert von mindestens fünf Minuten.

Anwendungsfälle für Standorte

In diesem Abschnitt werden einige typische Szenarien für die Standortermittlung sowie Empfehlungen für die optimale Nutzung der APIs für Geofencing und kombinierte Standortbestimmung beschrieben.

Für Nutzer sichtbare Updates oder Updates im Vordergrund

Beispiel: Eine Kartenanwendung, die häufige, genaue Aktualisierungen mit sehr niedriger Latenz benötigt. Alle Aktualisierungen finden im Vordergrund statt: Der Nutzer startet eine Aktivität, verwendet Standortdaten und beendet die Aktivität dann nach kurzer Zeit.

Verwenden Sie die Methode setPriority() mit dem Wert PRIORITY_HIGH_ACCURACY oder PRIORITY_BALANCED_POWER_ACCURACY.

Das in der Methode setInterval() angegebene Intervall hängt vom Anwendungsfall ab: Für Echtzeitszenarien sollten Sie den Wert auf wenige Sekunden festlegen. Andernfalls sollten Sie das Intervall auf wenige Minuten begrenzen. Wir empfehlen, die Akkunutzung auf mindestens zwei Minuten zu reduzieren.

Standort des Geräts ermitteln

Beispiel: Eine Wetter-App möchte den Standort des Geräts ermitteln.

Verwenden Sie die Methode getLastLocation(), die den zuletzt verfügbaren Standort zurückgibt (der in seltenen Fällen null sein kann) . Diese Methode bietet eine einfache Möglichkeit zum Abrufen des Standorts. Es fallen keine Kosten an, die mit der aktiven Anforderung von Standortaktualisierungen verbunden sind. Wird in Verbindung mit der Methode isLocationAvailable() verwendet, die true zurückgibt, wenn der von getLastLocation() zurückgegebene Standort angemessen aktuell ist.

Updates starten, wenn sich ein Nutzer an einem bestimmten Standort befindet

Beispiel: Updates anfordern, wenn sich ein Nutzer in einem bestimmten Umkreis von der Arbeit, von zu Hause oder von einem anderen Ort befindet.

Verwenden Sie Geofencing in Verbindung mit Updates von kombinierten Standortanbietern. Fordere Updates an, wenn die App einen Geofence-Einstiegstrigger empfängt, und entferne Updates, wenn die App einen Geofence-Exit-Trigger empfängt. Dadurch erhält die App nur dann detailliertere Standortaktualisierungen, wenn der Nutzer ein festgelegtes Gebiet betritt.

Der typische Workflow für dieses Szenario könnte beinhalten, eine Benachrichtigung beim Übergang von Geofence anzuzeigen und eine Aktivität zu starten, die Code zum Anfordern von Updates enthält, wenn der Nutzer auf die Benachrichtigung tippt.

Updates auf Grundlage des Aktivitätsstatus des Nutzers starten

Beispiel: Updates werden nur dann angefordert, wenn der Nutzer Auto oder Fahrrad fährt.

Verwenden Sie die Activity Recognition API in Verbindung mit Updates von kombinierten Standortanbietern. Aktualisierungen anfordern, wenn die Zielaktivität erkannt wird, und Aktualisierungen entfernen, wenn der Nutzer die Ausführung dieser Aktivität beendet

Der typische Workflow für diesen Anwendungsfall könnte das Einblenden einer Benachrichtigung über die erkannte Aktivität und das Starten einer Aktivität mit Code beinhalten, mit dem Updates angefordert werden, wenn der Nutzer auf die Benachrichtigung tippt.

Lang andauernde Updates der Standortermittlung im Hintergrund für bestimmte Regionen

Beispiel: Der Nutzer möchte benachrichtigt werden, wenn sich das Gerät in der Nähe eines Einzelhändlers befindet.

Dies ist ein hervorragender Anwendungsfall für das Geofencing. Da der Anwendungsfall mit hoher Wahrscheinlichkeit die Standortermittlung im Hintergrund umfasst, sollten Sie die Methode addGeofences(GeofencingRequest, PendingIntent) verwenden.

Legen Sie die folgenden Konfigurationsoptionen fest:

  • Wenn Sie Übergänge für die Verweildauer erfassen, verwenden Sie die Methode setLoiteringDelay() und übergeben Sie einen Wert von maximal fünf Minuten.

  • Verwenden Sie setNotificationResponsiveness() und übergeben Sie einen Wert von etwa fünf Minuten. Ziehen Sie jedoch einen Wert von etwa zehn Minuten in Betracht, wenn Ihre Anwendung die zusätzliche Reaktionsverzögerung bewältigen kann.

Für eine App dürfen jeweils nur maximal 100 Geofences registriert werden. Wenn eine App eine große Anzahl von Händleroptionen verfolgen möchte, möchte die App unter Umständen große Geofences (auf Stadtebene) und kleinere Geofences (für Standorte innerhalb der Stadt) für Geschäfte innerhalb des größeren Geofence dynamisch registrieren. Wenn der Nutzer einen großen Geofence betritt, können kleinere Geofences hinzugefügt werden. Verlässt der Nutzer den größeren Geofence, können die kleineren Geofences entfernt und Geofences neu für einen neuen Bereich registriert werden.

Lang andauernde Aktualisierungen der Standortermittlung im Hintergrund ohne sichtbare App-Komponente

Beispiel: Eine App, die den Standort passiv erfasst

Verwenden Sie nach Möglichkeit die Methode setPriority() mit der Option PRIORITY_NO_POWER, da der Akku fast nicht entladen wird. Wenn die Verwendung von PRIORITY_NO_POWER nicht möglich ist, verwenden Sie PRIORITY_BALANCED_POWER_ACCURACY oder PRIORITY_LOW_POWER. Vermeiden Sie jedoch die Nutzung von PRIORITY_HIGH_ACCURACY für kontinuierliche Hintergrundarbeit, da diese Option den Akku stark entlädt.

Wenn Sie mehr Standortdaten benötigen, verwenden Sie den passiven Standort. Rufen Sie dazu die Methode setFastestInterval() auf und übergeben Sie einen kleineren Wert als den, den Sie an setInterval() übergeben. In Kombination mit der Option PRIORITY_NO_POWER kann der passive Standort bei Bedarf den von anderen Anwendungen berechneten Standort ohne Aufpreis bereitstellen.

Moderieren Sie die Häufigkeit, indem Sie mit der Methode setMaxWaitTime() etwas Latenz hinzufügen. Wenn Sie beispielsweise die Methode setinterval() mit einem Wert von etwa 10 Minuten verwenden, sollten Sie setMaxWaitTime() mit einem Wert zwischen 30 und 60 Minuten aufrufen. Mit diesen Optionen wird der Standort für Ihre Anwendung etwa alle 10 Minuten berechnet. Die Anwendung wird jedoch nur alle 30 bis 60 Minuten geweckt und einige Standortdaten sind als Batch-Update verfügbar. Bei diesem Ansatz wird die Latenz gegen mehr verfügbare Daten und eine bessere Akkuleistung abgewogen.

Häufige Updates mit hoher Genauigkeit, während der Nutzer mit anderen Apps interagiert

Beispiel: Eine Navigations- oder Fitness-App funktioniert auch dann, wenn der Nutzer entweder den Bildschirm ausschaltet oder eine andere App öffnet.

Verwenden Sie einen Dienst im Vordergrund. Wenn Ihre App potenziell teure Arbeit im Auftrag des Nutzers ausführen soll, empfiehlt es sich, den Nutzer auf diese Arbeit hinzuweisen. Für einen Dienst im Vordergrund ist eine dauerhafte Benachrichtigung erforderlich. Weitere Informationen finden Sie unter Benachrichtigungen.

Best Practices für Standorte

Mithilfe der Best Practices in diesem Abschnitt kannst du die Akkunutzung deiner App reduzieren.

Standortaktualisierungen entfernen

Eine häufige Ursache für unnötigen Akkuverbrauch ist, dass Standortupdates nicht entfernt werden, wenn sie nicht mehr benötigt werden. Dies kann beispielsweise der Fall sein, wenn die Lebenszyklusmethoden onStart() oder onResume() einer Aktivität einen Aufruf von requestlocationUpdates() ohne entsprechenden Aufruf von removeLocationUpdates() in den Lebenszyklusmethoden onPause() oder onStop() enthalten.

Mit Komponenten, die den Lebenszyklus berücksichtigen, können Sie den Lebenszyklus der Aktivitäten in Ihrer App besser verwalten. Weitere Informationen finden Sie unter Lebenszyklen mit lebenszyklussensitiven Komponenten handhaben.

Zeitlimits festlegen

Legen Sie ein angemessenes Zeitlimit fest, nach dem Standortaktualisierungen beendet werden sollen, um eine schnelle Akkuentladung zu verhindern. Das Zeitlimit sorgt dafür, dass Updates nicht auf unbestimmte Zeit fortgesetzt werden. Außerdem schützt es die Anwendung in Szenarien, in denen Updates angefordert, aber nicht entfernt werden (z. B. aufgrund eines Fehlers im Code).

Fügen Sie bei einer Anfrage für einen kombinierten Standortanbieter ein Zeitlimit hinzu. Dazu rufen Sie setExpirationDuration() auf, der einen Parameter empfängt, der die Zeit in Millisekunden seit dem letzten Aufruf der Methode darstellt. Sie können auch ein Zeitlimit hinzufügen. Dazu rufen Sie setExpirationTime() auf. Dabei wird ein Parameter empfangen, der die Ablaufzeit in Millisekunden seit dem letzten Start des Systems darstellt.

Rufen Sie die Methode setExpirationDuration() auf, um einer Geofence-Standortanfrage ein Zeitlimit hinzuzufügen.

Batchanfragen

Für alle Anwendungsfälle, die nicht im Vordergrund stehen, kannst du mehrere Anfragen im Batch zusammenfassen. Mit der Methode setInterval() können Sie das Intervall angeben, in dem der Standort berechnet werden soll. Verwenden Sie dann die Methode setMaxWaitTime(), um das Intervall festzulegen, in dem der Standort an Ihre App ausgeliefert wird. Der an die Methode setMaxWaitTime() übergebene Wert sollte ein Vielfaches des an die Methode setInterval() übergebenen Werts sein. Betrachten Sie zum Beispiel die folgende Standortanfrage:

Kotlin

val request = LocationRequest()
request.setInterval(10 * 60 * 1000)
request.setMaxWaitTime(60 * 60 * 1000)

Java

LocationRequest request = new LocationRequest();
request.setInterval(10 * 60 * 1000);
request.setMaxWaitTime(60 * 60 * 1000);

In diesem Fall wird der Standort etwa alle zehn Minuten berechnet und etwa sechs Standortdatenpunkte werden im Batch etwa jede Stunde gesendet. Sie erhalten zwar weiterhin alle zehn Minuten Standortaktualisierungen, sparen jedoch den Akku, da Ihr Gerät nur etwa stündlich aufgewacht wird.

Passive Standortupdates verwenden

Bei Anwendungsfällen im Hintergrund empfiehlt es sich, Standortaktualisierungen zu drosseln. Diese Vorgehensweise wird durch Android 8.0-Limits erzwungen. Bei Apps, die auf älteren Geräten ausgeführt werden, sollte jedoch versucht werden, die Standortermittlung im Hintergrund so weit wie möglich einzuschränken.

Während Ihre App im Hintergrund ausgeführt wird, kann es wahrscheinlich sein, dass eine andere App häufig Standortaktualisierungen im Vordergrund anfordert. Die Standortdienste stellen diese Aktualisierungen für Ihre App zur Verfügung. Betrachten Sie die folgende Standortanfrage, bei der Standortdaten je nach Gelegenheit verbraucht werden:

Kotlin

val request = LocationRequest()
request.setInterval(15 * 60 * 1000)
request.setFastestInterval(2 * 60 * 1000)

Java

LocationRequest request = new LocationRequest();
request.setInterval(15 * 60 * 1000);
request.setFastestInterval(2 * 60 * 1000);

Im vorherigen Beispiel wird der Standort für Ihre Anwendung etwa alle 15 Minuten berechnet. Wenn andere Apps den Standort anfordern, werden der App die Daten in einem maximalen Intervall von zwei Minuten zur Verfügung gestellt.

Während die passive Nutzung des Standorts keine Entladung des Akkus verursacht, sollten Sie besonders vorsichtig sein, wenn der Erhalt von Standortdaten teure CPU- oder E/A-Vorgänge auslöst. Zur Minimierung der Akkukosten sollte das in setFastestInterval() angegebene Intervall nicht zu klein sein.

Mithilfe der Empfehlungen auf dieser Seite können Sie die Akkuleistung der Geräte Ihrer Nutzer erheblich verbessern. Die Wahrscheinlichkeit, dass Nutzer Apps löschen, die ihren Akku nicht belasten, ist geringer.