Optymalizacja korzystania z lokalizacji pod kątem czasu pracy na baterii

Aby zminimalizować wpływ aplikacji na czas pracy baterii urządzenia, gdy korzystasz z usług lokalizacyjnych, wykonaj te czynności.

Usuwanie aktualizacji lokalizacji

Częstym źródłem niepotrzebnego rozładowania baterii jest brak usuwania aktualizacji lokalizacji, gdy nie są już potrzebne.

Może się tak zdarzyć, gdy metody cyklu życia onStart() lub onResume() aktywności zawierają wywołanie requestlocationUpdates() bez odpowiadającego 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 Zarządzanie cyklem życia za pomocą komponentów uwzględniających cykl życia.

Ustawianie limitów czasu

Aby chronić baterię przed rozładowaniem, ustaw odpowiedni czas oczekiwania, po upływie którego aktualizacje lokalizacji powinny się zatrzymać. Czas oczekiwania sprawia, że aktualizacje nie są wykonywane w nieskończoność. Chroni to aplikację w sytuacjach, gdy żądane są aktualizacje, ale nie są usuwane (np. z powodu błędu w kodzie).

W przypadku żądania dostawcy z połączonych danych o lokalizacji dodaj limit czasu, wywołując funkcję setExpirationDuration(), która otrzymuje parametr reprezentujący czas w milisekundach od ostatniego wywołania metody. Możesz też dodać limit czasu, wywołując funkcję setExpirationTime(), która otrzymuje parametr reprezentujący czas wygaśnięcia w milisekundach od ostatniego uruchomienia systemu.

Aby dodać limit czasu do żądania lokalizacji w geofencingu, wywołaj metodę setExpirationDuration().

Żądania zbiorcze

W przypadku wszystkich zastosowań niebędących na pierwszym planie wysyłaj zbiorczo wiele żądań. Aby określić przedział, w którym chcesz obliczać położenie, użyj metody setInterval(). Następnie użyj metody setMaxWaitTime(), aby ustawić interwał, w którym lokalizacja jest przekazywana do aplikacji. Przekaż do metody setMaxWaitTime() wartość będącą wielokrotnością wartości przekazanej do metody setInterval(). Rozważmy na przykład takie żądanie lokalizacji:

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);

W takim przypadku system oblicza lokalizację mniej więcej co 10 minut i przekazuje około 6 punktów danych o lokalizacji w partii co około godzinę. Nadal otrzymujesz aktualizacje lokalizacji co około 10 minut, ale oszczędzasz baterię, ponieważ urządzenie budzi się tylko co godzinę.

Korzystanie z biernych aktualizacji lokalizacji

W przypadku używania aplikacji w tle warto ograniczać częstotliwość aktualizacji lokalizacji. Ograniczenia w Androidzie 8.0 (poziom interfejsu API 26) wymuszają tę praktykę, ale aplikacje działające na urządzeniach ze starszymi wersjami systemu powinny w miarę możliwości ograniczać lokalizację w tle.

Prawdopodobnie, gdy Twoja aplikacja działa w tle, inna aplikacja często prosi o aktualizacje lokalizacji na pierwszym planie. Usługi lokalizacji udostępniają te aktualizacje Twojej aplikacji. Rozważ prośbę o lokalizację, która okazjonalnie pobiera dane o lokalizacji:

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);

W poprzednim przykładzie lokalizacja aplikacji jest obliczana mniej więcej co 15 minut. Jeśli inne aplikacje żądają lokalizacji, aplikacja otrzymuje dane z maksymalnie 2-minutowym interwałem.

Chociaż korzystanie z lokalizacji w trybie pasywnym nie powoduje zużycia baterii, należy zachować szczególną ostrożność w przypadkach, gdy odbieranie danych o lokalizacji powoduje kosztowne operacje procesora lub operacje wejścia/wyjścia. Aby zminimalizować koszty baterii, interwał określony w setFastestInterval() nie powinien być zbyt krótki.