在我的应用程序中,一项活动启动了一项服务。服务在其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
这个障碍让我几个星期都在寻找,我将不胜感激任何帮助, 谢谢大家!
答案 0 :(得分:0)
您有几种选择:
让您接近异步:让服务在完成后通知Activity。您可以使用BroadcastReceiver
来实现此目的。
如果此服务是短暂的,并且仅在您的活动内部使用,那么您不需要服务。请改用AsyncTask
。