В моем приложении активность запускает службу. Служба получает сетевое геоположение в своем методе onLocatioChanged и записывает его в Shared Preferences. Затем вызывает свой собственный stopSelf (); метод.
Вернувшись в свою активность, я снова прочитал геопозицию из Shared Prefs.
Мой код на самом деле работает, единственная проблема в том, что геопозиция, которую моя активность считывает из общих префов, всегда с самого начала запуска сервиса.
Службе требуются несколько миллисекунд для получения геопозиции - в течение этого времени активность прочитала устаревшую (предыдущую) геопозицию.
Я искал форум, пытался запустить Servive в новой теме и ввел время ожидания в теме активности с помощью Thread.sleep (). Пока ничего не получалось.
Соответствующий код из моей Активности для запуска GeoServce.class и чтения общих привилегий:
btnGeoPos.setOnLongClickListener (new View.OnLongClickListener(){
public boolean onLongClick(View v) {
startService(new Intent(getApplicationContext(), GeoService.class));
SharedPreferences mPrefs = getApplicationContext().getSharedPreferences("CurrentLoc", MODE_PRIVATE);
DisplayLoc = mPrefs.getString("LocationTransfer", "not available");
Toast.makeText(getApplicationContext()," GeoService retrieved: "+DisplayLoc, Toast.LENGTH_LONG).show();
return true; //LongClick was consumed
}
});
Это мой класс Service, который записывает геопозицию в SharedPrefs, он отлично работает как таковой:
public class GeoService extends Service {
Location location = null;
LocationManager lm;
LocationListener ll;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
public void onCreate() {
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
ll = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1,1000, ll);
}
public void onStart(Intent intent, int startiD){}
private class MyLocationListener implements LocationListener {
public void onLocationChanged(Location location) {
String message = String.format("Current Location \n Longitude: %1$s \n Latitude: %2$s",location.getLongitude(), location.getLatitude());
Toast.makeText(GeoService.this, message, Toast.LENGTH_LONG).show();
SharedPreferences mPrefs = GeoService.this.getSharedPreferences("CurrentLoc", MODE_PRIVATE);
SharedPreferences.Editor editor1 = mPrefs.edit();
editor1.putString("LocationTransfer", message); // LocationTransfer is the key, message is the content passed
editor1.commit();
lm.removeUpdates(ll);
stopSelf();
}
public void onStatusChanged(String s, int i, Bundle b) {}
public void onProviderDisabled(String s) {
Toast.makeText(GeoService.this,"Network Location turned off",Toast.LENGTH_LONG).show();
}
public void onProviderEnabled(String s) {}
}// End inner class
}// End Class
Этот блокпост держит меня в поисках уже несколько недель, я был бы признателен за любую помощь,
спасибо всем!