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()
za pomocą 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.