Optymalizuj lokalizację, aby oszczędzać baterię

Lokalizacja w tle Limity wprowadzone w Android 8.0 (poziom interfejsu API 26) ponownie skupia się na tym, korzystanie z usług lokalizacyjnych wpływa na zużycie baterii. Ta strona zawiera adres pewnej lokalizacji sprawdzone metody dotyczące usług i to, co możesz zrobić już, aby zwiększyć zużycie baterii przez aplikacje efektywne. Zastosowanie tych sprawdzonych metod będzie korzystne dla Twojej aplikacji niezależnie wersji platformy, na której działa.

Limity lokalizacji w tle w Androidzie 8.0 spowodowały wprowadzenie tych zmian:

  • Zbieranie danych o lokalizacji w tle jest ograniczane, a lokalizacja jest obliczana. tylko kilka razy na godzinę.
  • Skanowanie Wi-Fi jest bardziej restrykcyjne, a aktualizacje lokalizacji nie są obliczane, gdy urządzenie pozostaje połączone z tym samym statycznym punktem dostępu.
  • Czas reakcji geofencingu zmienia się z dziesiątek sekund do około 2 min. Ta zmiana znacząco zwiększa wydajność baterii – nawet 10 razy na niektórych urządzeniach.

Zakładamy, że korzystasz z Usług lokalizacyjnych Google interfejsów API, które zapewniają większą dokładność obciążenie baterii jest mniejsze niż lokalizacja na ramce interfejsów API. W przy założeniu, że zna ona dostawcę uśrednionej lokalizacji API który łączy sygnały z GPS-u, Wi-Fi i sieci komórkowych, akcelerometr, żyroskop, magnetometr i inne czujniki. Musisz też nie znam geofencingu API, oprócz interfejsu fused Location Provider API i jest zoptymalizowany pod kątem baterii skuteczność reklam.

Informacje o szybkim zużywaniu baterii

Zbieranie danych o lokalizacji i zużycie baterii są bezpośrednio związane z: a także następujące aspekty:

  • Dokładność: precyzja danych o lokalizacji. Ogólnie im wyższa tym większe zużycie baterii.
  • Częstotliwość: jak często obliczana jest lokalizacja. Częstsza lokalizacja to tym więcej zużywa baterię.
  • Opóźnienie: szybkość dostarczania danych o lokalizacji. Mniejsze opóźnienia wymagają zwykle więcej baterii.

Dokładność

Dokładność lokalizacji możesz określić za pomocą setPriority() z jedną z tych wartości jako argument:

  • PRIORITY_HIGH_ACCURACY zapewnia najdokładniejszą możliwą lokalizację, która jest obliczana przy użyciu wprowadzania danych wejściowych w zależności od potrzeb (umożliwia korzystanie z GPS-a, Wi-Fi i sieci komórkowej oraz różne czujników) i może powodować, znacznie obciążają baterię.
  • PRIORITY_BALANCED_POWER_ACCURACY podaje dokładną lokalizację przy jednoczesnej optymalizacji zużycia energii. Bardzo rzadko używa GPS. Do obliczeń zwykle używa połączenia Wi-Fi i informacji o sieci komórkowej lokalizację urządzenia.
  • PRIORITY_LOW_POWER opiera się głównie na stacjach bazowych sieci komórkowych i nie używa wejść GPS i Wi-Fi, przybliżoną (na poziomie miasta) dokładność przy minimalnym zużyciu baterii;
  • PRIORITY_NO_POWER otrzymuje pasywnie lokalizacje od innych aplikacji, w przypadku których już obliczone.

Potrzeby w zakresie lokalizacji w przypadku większości aplikacji można zaspokoić dzięki zrównoważonej mocy lub niskiej opcje zasilania. Wysoką dokładność należy zarezerwować dla aplikacji działających w na pierwszym planie i wymagają aktualizacji lokalizacji w czasie rzeczywistym (np. mapowania ).

Częstotliwość

Częstotliwość wyświetlania lokalizacji możesz określić na 2 sposoby:

  • Użyj setinterval() do określenia odstępu, w którym przyjmowana jest lokalizacja aplikacji.
  • Użyj setFastestInterval() aby określić interwał, w którym lokalizacja obliczana dla innych aplikacji jest do aplikacji.

Podczas korzystania z funkcji setInterval() należy przekazać największą możliwą wartość. To jest zwłaszcza w przypadku zbierania danych o lokalizacji w tle, które często są źródłem niepotrzebnie szybko rozładowuje baterię. Stosując kilka-sekundowe odstępy, należy zarezerwować dla i zastosowania na pierwszym planie. Limity lokalizacji w tle wprowadzone w Androidzie 8.0 wymuszać te strategie, ale Twoja aplikacja powinna starać się to robić na Androidzie. Urządzenia z Androidem 7.0 lub starszym.

Opóźnienie

Opóźnienie możesz określić za pomocą funkcji setMaxWaitTime() która zwykle przekazuje wartość, która jest kilkakrotnie większa od wartości przedziału określona w tagu setInterval() . To ustawienie opóźnia dostawę według lokalizacji. Wiele zmian w lokalizacji może będą dostarczane partiami. Te dwie zmiany pomagają zminimalizować zużycie baterii.

Jeśli aplikacja nie wymaga od razu aktualizacji lokalizacji, musisz przekazać największą możliwą wartość do metody setMaxWaitTime(), co pozwala handlować opóźnienia, aby zwiększyć transmisję danych i baterię.

Przy korzystaniu z funkcji geofence aplikacje powinny przekazywać dużą wartość setNotificationResponsiveness() do zachowania mocy. Zalecana wartość to 5 minut lub większa.

Przypadki użycia lokalizacji

W tej sekcji opisano kilka typowych scenariuszy zbierania danych o lokalizacji, a także zalecenia dotyczące optymalnego użycia geofencingu i dostawcy uśrednionej lokalizacji API.

Widoczne dla użytkownika lub aktualizacje na pierwszym planie

Przykład: aplikacja mapowa, która wymaga częstych, dokładnych aktualizacji i bardzo niskich wyników opóźnienia. Wszystkie aktualizacje odbywają się na pierwszym planie: użytkownik rozpoczyna działanie, pobiera dane o lokalizacji, a po krótkim czasie przerywa działanie.

Użyj setPriority() o wartości PRIORITY_HIGH_ACCURACY lub PRIORITY_BALANCED_POWER_ACCURACY.

Przedział czasu określony w parametrze setInterval() zależnie od przypadku użycia: w przypadku scenariuszy w czasie rzeczywistym ustaw wartość na kilka sekundy; w przeciwnym razie ogranicz do kilku minut (około dwóch minut lub większa zalecany jest w celu zminimalizowania zużycia baterii).

Znajomość lokalizacji urządzenia

Przykład: aplikacja pogodowa chce poznać lokalizację urządzenia.

Użyj getLastLocation() która zwraca najnowszą dostępną lokalizację (która rzadko przypadki mogą mieć wartość null) . Ta metoda pozwala w prosty sposób określić lokalizację nie wiąże się z opłatami za aktywne żądanie aktualizacji lokalizacji. Używaj w połączeniu z isLocationAvailable() , która zwraca true, gdy lokalizacja zwrócona przez getLastLocation() są wystarczająco aktualne.

Uruchamianie aktualizacji, gdy użytkownik znajduje się w określonej lokalizacji

Przykład: prośba o aktualizację, gdy użytkownik znajduje się w określonej odległości od pracy, domu lub innego miejsca.

Używaj geofencingu w połączeniu z technologią uśrednioną. aktualizacje dostawcy lokalizacji. Poproś o aktualizacje, gdy aplikacja otrzyma geofence wyzwalacza wejścia i usuwanie aktualizacji, gdy aplikacja otrzymuje wyjście geofence . Dzięki temu aplikacja będzie otrzymywać bardziej szczegółowe aktualizacje lokalizacji tylko wtedy, użytkownik wszedł do zdefiniowanego obszaru.

Typowym przepływem pracy w tym scenariuszu może być wyświetlenie powiadomienia po przejściu geofencingu i uruchomieniu aktywności, która zawiera kod żądania aktualizacji, gdy użytkownik kliknie powiadomienie.

Rozpoczynanie aktualizacji na podstawie stanu aktywności użytkownika

Przykład: żądanie aktualizacji tylko wtedy, gdy użytkownik jedzie samochodem roweru.

Użyj rozpoznawania aktywności API w w połączeniu z połączonymi aktualizacjami dostawcy lokalizacji. Poproś o aktualizacje, gdy jest wykrywana aktywność docelowa i usuwa aktualizacje, gdy użytkownik przestaje wykonując tę czynność.

Typowym przepływem pracy w tym przypadku użycia może być powiadomienie o wykrytej aktywności oraz uruchomienie działania, zawiera kod żądania aktualizacji, gdy użytkownik kliknie powiadomienie.

Długo trwające aktualizacje lokalizacji w tle powiązane z obszarami geograficznymi

Przykład: użytkownik chce otrzymywać powiadomienia, gdy urządzenie znajduje się w pobliżu sprzedawcy.

To świetny przypadek użycia dla geofencingu. Ponieważ w przypadku zastosowania niemal z całą pewnością obejmuje lokalizację w tle, użyj addGeofences(GeofencingRequest, PendingIntent) .

Ustaw te opcje konfiguracji:

  • Jeśli śledzisz przejścia między urządzeniami, użyj funkcji setLoiteringDelay() przesyłającą wartość wynoszącą około pięciu minut lub mniej.

  • Użyj setNotificationResponsiveness() przekazując wartość około pięciu minut. Rozważ jednak użycie wartości może zająć około 10 minut. czas reakcji.

Aplikacja może zarejestrować maksymalnie 100 geofencingu jednocześnie. W użyciu w przypadku aplikacji, które chcą śledzić dużą liczbę opcji oferowanych przez sprzedawcę, mogą zdecydować się na rejestrację dużych geofencingu (na poziomie miasta) i dynamicznie zarejestruj mniejsze obszary geograficzne (dla sklepów w mieście) z większym geofencem. Gdy użytkownik wchodzi na duży geofence, mniejsze geofence zostać dodany; Gdy użytkownik opuści większy obszar geograficzny, zostać usunięte i ponownie zarejestrowane dla nowego obszaru.

Długo trwające aktualizacje lokalizacji w tle bez widocznego komponentu aplikacji

Przykład: aplikacja, która pasywnie śledzi lokalizację

Użyj setPriority() z użyciem funkcji PRIORITY_NO_POWER jeśli to możliwe, ponieważ powoduje niemal całkowite zużycie baterii. Jeśli używasz Metoda PRIORITY_NO_POWER jest niemożliwa, użyj funkcji PRIORITY_BALANCED_POWER_ACCURACY. lub PRIORITY_LOW_POWER, ale unikaj stosowania PRIORITY_HIGH_ACCURACY w przypadku długotrwałej pracy w tle, ponieważ ta opcja powoduje znaczne zużycie baterii.

Jeśli potrzebujesz więcej danych o lokalizacji, użyj lokalizacji pasywnej, wywołując funkcję setFastestInterval() przekazującą wartość mniejszą od wartości, do której setInterval() W połączeniu z PRIORITY_NO_POWER usługi lokalizacji pasywnej mogą dostarczać informacji o lokalizacji obliczonej przez innych aplikacji bez dodatkowych opłat.

Umiarkowaną częstotliwość przez zwiększenie opóźnienia przy użyciu setMaxWaitTime() . Na przykład jeśli używasz metody setinterval() z wartością w ciągu około 10 minut, warto zadzwonić pod numer setMaxWaitTime() i wysłać wartość od 30 do 60 minut. Przy użyciu tych opcji obliczana jest lokalizacja dla aplikacji średnio co 10 minut, ale aplikacja jest tylko wybudzona co 30–60 minut (niektóre dane o lokalizacji są dostępne w ramach aktualizacji zbiorczej). Ten pozwala skrócić czas oczekiwania, co przekłada się na więcej danych i lepszą baterię skuteczność reklam.

Częste aktualizacje o wysokiej dokładności, gdy użytkownik wchodzi w interakcje z innymi aplikacjami

Przykład: aplikacja do nawigacji lub fitnessu, która działa, gdy użytkownik Wyłącza ekran lub otwiera inną aplikację.

Użyj usługi na pierwszym planie. czy kosztowny projekt może zostać wykonany. przez aplikację w imieniu użytkownika. Poinformuj go, że ta praca zalecanej sprawdzonej metody. Usługa działająca na pierwszym planie wymaga obiektu trwałego powiadomienia. Więcej informacji znajdziesz w sekcji Powiadomienia Przegląd.

Sprawdzone metody dotyczące lokalizacji

Stosowanie sprawdzonych metod opisanych w tej sekcji pomaga zmniejszyć zużycie baterii do aplikacji.

Usuń aktualizacje lokalizacji

Częstym powodem niepotrzebnego zużycia baterii jest brak usunięcia lokalizacji. aktualizacje, gdy nie są już potrzebne. Może się tak na przykład zdarzyć, gdy onStart() aktywności lub onResume() Cykl życia metody zawierają wywołanie do requestlocationUpdates() bez odpowiedniego wywołania do removeLocationUpdates() w sekcji onPause() lub onStop() metod cyklu życia.

Możesz wykorzystać komponenty uwzględniające cykl życia, aby lepiej zarządzać cyklem życia aktywności w aplikacji. Więcej informacji znajdziesz w artykule Obsługa cykli życia za pomocą Komponenty uwzględniające cykl życia.

Ustawianie czasu oczekiwania

Aby uniknąć wyczerpania baterii, ustaw rozsądny czas oczekiwania na aktualizację lokalizacji powinno zostać zatrzymane. Ustawienie limitu czasu powoduje, że aktualizacje nie będą kontynuowane w nieskończoność. chroni aplikację w sytuacjach, gdy zażądano aktualizacji, ale nie zostały one usunięte (na przykład z powodu błędu w kodzie).

W przypadku żądania dostawcy uśrednionej lokalizacji dodaj czas oczekiwania przez połączenie setExpirationDuration() który otrzymuje parametr reprezentujący czas w milisekundach od momentu wywołania zostało ostatnio wywołane. Możesz też dodać limit czasu, dzwoniąc setExpirationTime() który otrzymuje parametr reprezentujący czas wygaśnięcia w milisekundach od ostatniego uruchomienia systemu.

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

Żądania zbiorcze

We wszystkich przypadkach użycia niezwiązanych z pierwszym planem zgrupuj wiele żądań razem. Za pomocą setInterval() w celu określenia przedziału czasu, dla którego chcesz obliczyć lokalizację. Następnie skorzystaj z setMaxWaitTime() aby ustawić interwał dostarczania lokalizacji do aplikacji. wartość przekazywana do metody setMaxWaitTime() powinna być wielokrotnością wartości została przekazana do metody setInterval(). Na przykład rozważ te kwestie prośba o lokalizację:

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 tym przypadku lokalizacja jest obliczana w przybliżeniu co 10 minut i to około 6 punktów danych o lokalizacji jest dostarczanych partiami mniej więcej co godzinę. Mimo że informacje o lokalizacji są udostępniane mniej więcej co 10 minut, oszczędzasz baterii, bo urządzenie budzi się mniej więcej co godzinę.

Używanie pasywnych aktualizacji lokalizacji

W przypadkach użycia działających w tle warto ograniczyć aktualizacje lokalizacji. Android, Ograniczenia w wersji 8.0 wymuszają tę praktykę, ale aplikacje działające na starszych urządzeniach powinny postaraj się maksymalnie ograniczyć lokalizację w tle.

Możliwe, że gdy aplikacja działa w tle, inna aplikacja może często prosi o aktualizację lokalizacji na pierwszym planie. Usługi lokalizacyjne udostępnia te aktualizacje aplikacji. Weź pod uwagę następującą lokalizację które w razie potrzeby przetwarza 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 jest obliczana dla aplikacji mniej więcej co 15 min. Jeśli inne aplikacje zażądają lokalizacji, dane zostaną udostępnione aplikacji co najwyżej dwie minuty.

Pasywne korzystanie z lokalizacji nie obciąża baterii, ale zachowaj szczególną ostrożność w przypadku gdy odbiór danych o lokalizacji powoduje zużycie kosztownego procesora lub wejścia/wyjścia operacji. Aby zminimalizować koszty baterii, interwał określony w setFastestInterval() nie może być za mały.

Możesz znacznie zwiększyć wydajność baterii urządzenia według zgodnie z zaleceniami na tej stronie. Użytkownicy z mniejszym prawdopodobieństwem usuną treści które nie obciążają baterii.