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

Aby zminimalizować wpływ aplikacji na czas pracy baterii urządzenia podczas korzystania 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 którym 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ę setDurationMillis(), która otrzymuje parametr reprezentujący czas w milisekundach od ostatniego wywołania metody. Możesz też użyć tej metody, aby określić czas ważności.

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 ma być obliczana lokalizacja, użyj metody setIntervalMillis(). Następnie użyj metody setMaxUpdateDelayMillis(), aby ustawić interwał, w którym lokalizacja jest przekazywana do aplikacji. Przekaż do metody setMaxUpdateDelayMillis() wartość będącą wielokrotnością wartości przekazanej do metody setIntervalMillis(). Weźmy na przykład takie żą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 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. W Androidzie 8.0 (poziom interfejsu API 26) obowiązują ograniczenia, które 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 dostęp do lokalizacji, która okazjonalnie pobiera 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 żą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 wejścia/wyjścia. Aby zminimalizować koszty baterii, interwał określony w setMinUpdateIntervalMillis() nie powinien być zbyt krótki.