2013-06-17 10 views
7

Zastanawiam się nad dwoma osobnymi alarmami, które gromadzą dane o lokalizacji użytkownika co godzinę, jedną, która znika co 59 minut, aby "połączyć" klienta, a druga, aby uzyskać lokalizację, a następnie odłączyć klienta.Jaki jest najbardziej wydajny pod względem zużycia baterii sposób korzystania z usługi LocationClient w celu okresowego pobierania aktualizacji?

Jeśli chodzi o czas pracy na baterii, czy jest coś jeszcze, co powinienem zrobić, jeśli lokalizacja użytkownika będzie głównym odpływem aplikacji? Czy istnieje inne podejście do posiadania dwóch alarmów? Początkowo miałem tylko jeden alarm, ale wykonanie połączenia (! MLocationClient.isConnected), a następnie połączenie nie daje klientowi czasu na nawiązanie połączenia.

Dzięki za twój wgląd.

Dwa alarmy pójdzie się coś takiego:

private int PERIODIC_UPDATE = 60000*60; //gets location and disconnects every hour 
private int PERIODIC_RECONNECTION_UPDATE = 60000*59; //connects 1 minute before getLocation call 

    Timer toReconnect = new Timer(); 
    toReconnect.schedule(new TimerTask() { 

     @Override 
     public void run() { 
      mLocationClient.connect(); 
     } 
    }, 5000, PERIODIC_RECONNECTION_UPDATE); 

    Timer theTimer = new Timer(); 
    theTimer.schedule(new TimerTask(){ 
     @Override 
     public void run() { 
      try { 
       if(!mLocationClient.isConnected()) { 
        mLocationClient.connect(); 
        //This will not have much affect because cannot so quickly, will remove. 
       } 

       Location theLocation = mLocationClient.getLastLocation(); 
       if(theLocation!=null) { 
        checkPostLocation(theLocation); 

        mLocationClient.disconnect(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     }}, 5000, PERIODIC_UPDATE); 
+0

Najbardziej korzystny sposób na baterię to wyłączenie wszystkich aplikacji Messenger i pozostawienie ekranu wyłączonego. Następnie możesz nagrywać GPS raz na sekundę przez ponad 8 godzin. – AlexWien

+0

@ jsc123 Należy pamiętać, że używanie Fused Location Provider z "getLastLocation()" nie gwarantuje lokalizacji GPS - możesz uzyskać lokalizację opartą głównie na czujnikach, sieci Wi-Fi lub połączeniu komórkowym. Poza tym niekoniecznie wymuszasz nową lokalizację, więc możesz uzyskać tę samą lokalizację, z której ostatnio korzystałeś, jeśli żadna inna aplikacja, w tym Usługi Google, nie poprosiła o zaktualizowaną lokalizację. –

+0

@SeanBarbeau, czy moja implementacja nie byłaby najlepsza, jeśli zawsze staram się okresowo uzyskać najdokładniejszą lokalizację, mimo że jest to większy drenaż? – NumenorForLife

Odpowiedz

2

Czy rzeczywiście potrzebujemy do śledzenia użytkownika?

Jeśli chodzi tylko o interfejs użytkownika, należy użyć getLastKnownLocation (PASSIVE_PROVIDER) i powinieneś uzyskać coś półdokładnego, zakładając, że korzystali z usług lokalizacyjnych na swoim telefonie w innym miejscu.

Jeśli chcesz rzeczywiście dokonać triangulacji użytkownika, zdaj sobie sprawę, że różni dostawcy używają innej baterii. Sieć pasywna < Sieć < GPS.

Im więcej zlokalizujesz użytkownika, tym więcej baterii będzie pobierało najwięcej energii i czasu.

Uruchom usługę, planując godzinę, godzinę lub cokolwiek, potrzebna jest tylko jedna usługa. Żyj tylko przez maksymalnie 1 minutę (lub mniej), słuchaj wszystkich dostawców lokalizacji. Po minucie lub dokładności jest wystarczająco dobre, zapisz wynik i zamknąć usługę.

+0

Cześć HaMMeReD, dziękuję za sugestie. Chciałbym, aby GPS był tak dokładny, jak to tylko możliwe. Czy powyższy kod ma sens? Aby oszczędzać baterię, odłączam się natychmiast po użyciu lokalizacji. Czyż nie oszczędziłoby to baterii, ponieważ zamiast ciągle mieć połączenie, mam je tylko przez około 1 minutę. – NumenorForLife

+0

Tak, po prostu odłącz się po triangulacji, ale zakładaj, że GPS może się nie zablokować za minutę, więc możesz chcieć skorzystać z innych dostawców w przypadku awarii GPS. – HaMMeReD

+0

Uwaga: jeśli chcesz określić dostawców, nie możesz korzystać z usług LocationClient i Usług Google Play ani z kodu w pytaniu - musisz użyć oryginalnego interfejsu API lokalizacji Androida. LocationClient używa dostawcy fused i zwraca tylko lokalizacje z getProvider() = "fused" –

3

Patrz „Odbieranie Aktualizacje lokalizacji” na Android docs deweloperskich na szczegółowe omówienie tego tematu z nowym Fused LocationProvider:

http://developer.android.com/training/location/receive-location-updates.html

Daje to możliwość zarejestrowania Intent z LocationListener do Fused LocationProvider, który jest automatycznie uruchamiany przez wewnętrzne struktury usług Google, gdy jest to uważane za "wydajne". Ufałbym, że ta struktura ma znacznie większy potencjał w zakresie optymalizacji zużycia energii, ponieważ ma o wiele więcej wiedzy na temat tego, co jeszcze dzieje się w systemie w porównaniu z zegarem zarejestrowanym w aplikacji.

Oto opcje dla rejestracji słuchacza z różnymi poziomami priorytetów energetycznych, które będą prowadzić do różnych poziomów energii z baterii, jak wymienione w powyższych docs:

  • PRIORITY_BALANCED_POWER_ACCURACY - Używane z setpriority (int) do zażądać dokładności poziomu "bloku". Dokładność poziomu bloku jest uważana za dokładność około 100 metrów. Używanie tak grubej dokładności często pochłania mniej energii.
  • PRIORITY_HIGH_ACCURACY - Używane z setPriority (int) do żądania najbardziej dokładnych dostępnych lokalizacji. Spowoduje to zwrócenie najlepszej dostępnej lokalizacji (i największy potencjał drenażu energii).
  • PRIORITY_NO_POWER - Używany z setPriority (int) do żądania najlepszej dokładności z zerowym dodatkowym zużyciem energii. Żadne lokalizacje nie zostaną zwrócone, chyba że inny klient zażądał aktualizacji lokalizacji. W takim przypadku żądanie to będzie pasywnym detektorem dla tych lokalizacji.
Powiązane problemy