Ich arbeite an einer App, die aus einem Service und einer Aktivität besteht. Der Dienst verwendet ein LocationClient-Objekt, um den aktuellen Standort jede Minute anzufordern. Die Aktivität verwendet ein anderes LocationClient-Objekt, um eine einzelne aktuelle Position anzufordern, nachdem auf eine Schaltfläche geklickt wurde.Mehrere LocationClients stören?
Im Dienst:
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(60000);
mLocationRequest.setFastestInterval(60000);
mLocationClient = new LocationClient(this, this, this);
// ... when connected:
mLocationClient.requestLocationUpdates(mLocationRequest, this);
In der Aktivität:
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(0); // 0 should be ok since only a single location is requested
mLocationRequest.setFastestInterval(0);
mLocationRequest.setNumUpdates(1); // get only a single location
mLocationClient = new LocationClient(this, this, this);
// ... when connected:
mLocationClient.requestLocationUpdates(mLocationRequest, this);
Der Service allein funktioniert wie erwartet.
Wenn jedoch der Dienst gestartet wird und die Aktivität versucht, einen einzelnen aktuellen Standort abzurufen, wird der Standort erst empfangen, wenn der Dienst einen aktualisierten Standort erhält. Die Aktivität muss also bis zu 60 Sekunden warten.
Aber wenn der Dienst nicht und die Aktivität versucht beginnt einen einzigen aktuellen Standort zu erhalten, dann erhält er die Position nach kurzer Zeit wie erwartet (in der Regel < 5 Sek.).
Was verursacht das Problem? Ist nur ein LocationListener pro App erlaubt?
Ich weiß, dass das Timing nicht garantiert ist.;-) Aber wenn ich die Dokumentation richtig verstehe, versucht der Ortungsdienst, das kleinstmögliche Intervall zu verwenden, das von den registrierten LocationRequests angegeben wird. In meinem Fall ist dies die Aktivität, nicht die der Dienstleistung. Ein anderes Beispiel: Wenn "Meine Tracks" den Ort jede Minute im Hintergrund verfolgt, kann meine Aktivität den aktuellen Ort immer noch viel schneller erreichen (~ 3 Sek.) - ohne die Interna von "Meine Tracks" zu kennen. Die Verwendung der beiden LocationClients über meiner Aktivität wartet jedoch immer auf die vom Dienst festgelegte Zeit. – Biggie
Beachten Sie die Dokumentation: "Diese Methode legt die Rate in Millisekunden fest, zu der Ihre App bevorzugt Standortaktualisierungen empfängt. Wenn keine anderen Apps Updates von den Standortdiensten erhalten, erhält Ihre App Updates mit dieser Rate." Die Dokumentation spricht von "der App" und nicht vom "LocationClient/LocationListener-Objekt". Deshalb habe ich nach Problemen mit mehreren LocationClients in der gleichen App gefragt. Für mich scheint es, als ob das erste Intervall in einem der LocationClients der App gewonnen hat. In meinem Fall das 60-Sekunden-Intervall des Dienstes. – Biggie
Nun, es gibt nichts in der Dokumentation, das LocationClient auf eine Instanz pro App beschränkt. Aber der Punkt, an dem Aktualisierungen App-weit sind, ist es wert, dass sie untersucht werden. Das ist mein Punkt bei Google Play Services. Es gibt nur eine Instanz/Version davon pro Telefon. Wenn Sie Updates über den LocationClient von den Play Services anfordern müssen, würde ich mir vorstellen, dass die letzte Anfrage die folgende wäre. Sie sollten die Werte wechseln und sehen, ob Sie das gegenteilige Ergebnis erhalten. – Rarw