Aby zmniejszyć wpływ aplikacji na czas pracy urządzenia na baterii podczas korzystania z usług lokalizacyjnych, wykonaj te czynności:
Usuwanie aktualizacji lokalizacji
Częstą przyczyną szybkiego zużycia baterii jest brak usunięcia aktualizacji lokalizacji, gdy nie są już potrzebne.
Może się to zdarzyć, gdy metody cyklu życia onStart() lub onResume() działania zawierają wywołanie requestlocationUpdates() bez odpowiedniego wywołania removeLocationUpdates() w metodach cyklu życia onPause() lub onStop().
Aby lepiej zarządzać cyklem życia aktywności w aplikacji, możesz używać komponentów uwzględniających cykl życia. Więcej informacji znajdziesz w artykule Obsługa cykli życia za pomocą komponentów uwzględniających cykl życia.
Ustawianie czasu oczekiwania
Aby zapobiec szybkiemu zużyciu baterii, ustaw rozsądny limit czasu, po którym aktualizacje lokalizacji powinny się zatrzymać. Limit czasu zapewnia, że aktualizacje nie będą trwać w nieskończoność, i chroni aplikację w sytuacjach, w których aktualizacje są wymagane, ale nie są usuwane (np. z powodu błędu w kodzie).
W przypadku żądania dostawcy uśrednionej lokalizacji dodaj czas oczekiwania, wywołując metodę setDurationMillis(), która przyjmuje parametr reprezentujący czas w milisekundach od ostatniego wywołania metody. Możesz też użyć metody, aby wyrazić czas wygaśnięcia w postaci czasu trwania.
Aby dodać limit czasu do żądania lokalizacji w ramach geofencingu, wywołaj metodę
setExpirationDuration().
Żądania zbiorcze
W przypadku wszystkich zastosowań innych niż na pierwszym planie łącz wiele żądań w pakiety. Użyj metody setIntervalMillis(), aby określić interwał, w którym chcesz obliczać lokalizację. Następnie użyj metody setMaxUpdateDelayMillis(), aby ustawić interwał, w którym lokalizacja jest dostarczana do aplikacji. Przekaż do metody setMaxUpdateDelayMillis() wartość, która jest wielokrotnością wartości przekazanej do metody setIntervalMillis(). Rozważmy na przykład to żądanie lokalizacji:
Kotlin
val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)
.setMaxUpdateDelayMillis(60 * 60 * 1000)
.build()
Java
LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)
.setMaxUpdateDelayMillis(60 * 60 * 1000)
.build();
W takim przypadku system oblicza lokalizację mniej więcej co 10 minut i przesyła w partii około 6 punktów danych o lokalizacji mniej więcej co godzinę. Nadal będziesz otrzymywać aktualizacje lokalizacji co około 10 minut, ale oszczędzisz baterię, ponieważ urządzenie będzie się włączać tylko co godzinę.
Korzystanie z pasywnych aktualizacji lokalizacji
W przypadku użycia w tle warto ograniczyć aktualizacje lokalizacji. Ograniczenia w Androidzie 8.0 (poziom interfejsu API 26) wymuszają to zachowanie, ale aplikacje działające na starszych urządzeniach powinny w jak największym stopniu ograniczać lokalizację w tle.
Prawdopodobnie, gdy Twoja aplikacja działa w tle, inna aplikacja często wysyła żądania aktualizacji lokalizacji na pierwszym planie. Usługi lokalizacyjne udostępniają te aktualizacje aplikacji. Rozważmy następującą prośbę o lokalizację, która oportunistycznie wykorzystuje dane o lokalizacji:
Kotlin
val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)
.setMinUpdateIntervalMillis(2 * 60 * 1000)
.build()
Java
LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)
.setMinUpdateIntervalMillis(2 * 60 * 1000)
.build();
W poprzednim przykładzie lokalizacja aplikacji jest obliczana mniej więcej co 15 minut. Jeśli inne aplikacje poproszą o lokalizację, aplikacja otrzyma dane w maksymalnym odstępie 2 minut.
Pasywne korzystanie z lokalizacji nie powoduje szybkiego zużycia baterii, ale w przypadku, gdy odbiór danych o lokalizacji wywołuje kosztowne operacje procesora lub wejścia/wyjścia, należy zachować szczególną ostrożność. Aby zminimalizować koszty baterii, interwał określony w parametrze setMinUpdateIntervalMillis() nie powinien być zbyt mały.