2013-06-17 4 views
7

Ich denke darüber nach, zwei separate Alarme zu haben, um die Standortdaten eines Benutzers stündlich zu erfassen, eine, die alle 59 Minuten abläuft, um den Client zu verbinden und eine Sekunde, um den Standort zu ermitteln und anschließend den Client zu trennen.Was ist der effizienteste Ansatz, um mit LocationClient regelmäßig Updates zu erhalten?

In Bezug auf die Lebensdauer der Batterie, sollte ich noch etwas tun, wenn der Standort des Benutzers der primäre Abfluss der App sein wird? Oder gibt es einen anderen Ansatz, um zwei Alarme zu haben? Ich hatte ursprünglich nur einen einzigen Alarm, aber die Durchführung einer (! MlocationClient.isConnected) und dann Verbindungsüberprüfung gibt dem Client nicht genug Zeit, um sich zu verbinden.

Danke für Ihre Einsicht.

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

Der effektivste Weg ist, alle Messenger Apps zu deaktivieren und das Display auszuschalten. Dann können Sie GPS für mehr als 8 Stunden einmal pro Sekunde aufzeichnen. – AlexWien

+0

@ jsc123 Beachten Sie, dass die Verwendung des Fused Location Providers mit "getLastLocation()" keine Garantie für einen GPS-Standort ist. Sie können einen Standort erhalten, der hauptsächlich auf Sensoren, WLAN oder Mobilfunkverbindungen basiert. Außerdem erzwingen Sie nicht unbedingt einen neuen Standort, sodass Sie möglicherweise den gleichen Speicherort erhalten, den Sie beim letzten Mal erhalten haben, wenn keine andere App, einschließlich Google Services, einen aktualisierten Speicherort angefordert hat. –

+0

@SeanBarbeau, wäre meine Implementierung nicht die beste, wenn ich immer versuche, den genauesten Standort in regelmäßigen Abständen zu erhalten, obwohl es ein größerer Abfluss ist? – NumenorForLife

Antwort

2

Haben Sie tatsächlich benötigen, um den Benutzer zu verfolgen:

Die beiden Alarme wäre so etwas wie dies gehen?

Wenn es nur um UI geht, dann benutze getLastKnownLocation (PASSIVE_PROVIDER) und du solltest etwas semi-akkurates erhalten, vorausgesetzt, dass sie Ortungsdienste auf ihrem Telefon woanders benutzt haben.

Wenn Sie den Benutzer tatsächlich triangulieren müssen, erkennen Sie, dass die verschiedenen Anbieter unterschiedliche Batterien verwenden. Passiv < Netzwerk < GPS.

Je mehr Sie den Benutzer finden, desto mehr Batterie mit GPS nimmt die meiste Batterie und Zeit.

Starten Sie den Dienst mit Absicht einen Zeitplan, 1 Stunde oder was auch immer, nur ein Dienst erforderlich. Leben Sie nur für maximal 1 Minute (oder weniger), hören Sie alle Location-Provider an. Nachdem die Minute oder Genauigkeit gut genug ist, speichern Sie das Ergebnis und fahren den Dienst herunter.

+0

Hi HaMMeReD, danke für deine Vorschläge. Ich möchte GPS so präzise wie möglich verwenden. Macht der obige Code also Sinn? Um Batterie zu sparen, trenne ich sofort nach der Verwendung des Standortes. Würde dies nicht die Akkulaufzeit verlängern, denn anstatt die Verbindung ständig zu haben, habe ich sie nur für ca. 1 Minute. – NumenorForLife

+0

Ja, trennen Sie die Verbindung nach dem Triangulieren, aber gehen Sie davon aus, dass sich das GPS möglicherweise nicht in einer Minute einsperrt. Daher sollten Sie die anderen Anbieter für den Fall verwenden, dass der GPS-Fehler fehlschlägt. – HaMMeReD

+0

Wenn Sie Provider angeben möchten, können Sie nicht den LocationClient und die Google Play-Dienste oder den Code in Ihrer Frage verwenden - Sie müssen die ursprüngliche Android Location API verwenden. LocationClient verwendet den fusionierten Provider und gibt nur Standorte mit getProvider() = "fusioniert" zurück –

3

Siehe „Empfang von Location Updates“ auf der Android-Entwickler-Dokumentation für eine ausführliche Diskussion über dieses Thema mit dem neuen Fused LocationProvider:

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

Dies gibt Ihnen die Möglichkeit, eine Absichtserklärung mit einem registrieren LocationListener für den Fused LocationProvider, der automatisch vom internen Google Services-Framework ausgelöst wird, wenn dies als "effizient" erachtet wird. Ich würde darauf vertrauen, dass dieses Framework ein viel größeres Potenzial hat, den Stromverbrauch zu optimieren, da es viel mehr Wissen darüber hat, was sonst noch im System passiert im Vergleich zu einem App-registrierten Timer.

Hier sind Ihre Optionen für einen Zuhörer mit unterschiedlichen Leistungsprioritätsstufen Registrierung, die in verschiedenen Ebenen des Batterieverbrauches führen wird, wie in dem obigen docs aufgeführt:

  • PRIORITY_BALANCED_POWER_ACCURACY - Gebraucht mit setPriority (int) zu fordern Sie "Block" -Pegelgenauigkeit an. Die Genauigkeit des Blocklevels wird als ungefähr 100 Meter genau angesehen. Eine grobe Genauigkeit wie diese verbraucht oft weniger Energie.
  • PRIORITY_HIGH_ACCURACY - Wird mit setPriority (int) verwendet, um die genauesten verfügbaren Standorte anzufordern. Dies wird den besten verfügbaren Standort (und das größte Potenzial für Energieentzug) zurückgeben.
  • PRIORITY_NO_POWER - Wird mit setPriority (int) verwendet, um die bestmögliche Genauigkeit ohne zusätzlichen Stromverbrauch anzufordern. Es werden keine Standorte zurückgegeben, es sei denn, ein anderer Client hat Standortaktualisierungen angefordert. In diesem Fall fungiert diese Anforderung als passiver Listener für diese Standorte.