从服务更新活动与地理位置时的时间问题(使用共享首选项将地理位置从服务传输到活动)

时间:2010-11-27 15:06:01

标签: android service geolocation

在我的应用程序中,一项活动启动了一项服务。服务在其onLocatioChanged方法中获取基于网络的地理位置,并将其写入共享首选项。然后调用自己的stopSelf();方法。 回到我的活动中,我再次从Shared Prefs中读取地理位置。

我的代码实际上有效,唯一的问题是我的Activity从共享首选项中读出的地理位置总是来自服务的私密开始。 服务需要几毫秒才能获得地理位置 - 在此期间,活动已读取过时(上一个)地理位置。 我搜索了论坛,尝试在新线程中启动Servive,并使用Thread.sleep()在Activity Thread中引入等待时间。到目前为止没有任何工作。

我的Acivity中的相关代码启动GeoServce.class,并读取共享Prefs:

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                   
    }          
    });

这是我将Serviceosition写入SharedPrefs的Service类,它本身可以正常工作:

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

这个障碍让我几个星期都在寻找,我将不胜感激任何帮助, 谢谢大家!

1 个答案:

答案 0 :(得分:0)

您有几种选择:

  1. 让您接近异步:让服务在完成后通知Activity。您可以使用BroadcastReceiver来实现此目的。

  2. 如果此服务是短暂的,并且仅在您的活动内部使用,那么您不需要服务。请改用AsyncTask