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

Posted

技术标签:

【中文标题】使用服务中的地理位置更新活动时的时序问题(使用共享首选项将地理位置从服务传输到活动)【英文标题】:Timing problem when updating Activity with Geoposition from a Service (using Shared Preferences to transmit the geoposition from Service to Activity) 【发布时间】:2010-11-27 15:06:00 【问题描述】:

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

我的代码确实有效,唯一的问题是我的 Activity 从共享首选项中读取的地理位置始终来自服务的 privious 启动。 服务需要几毫秒来获取地理位置——在这段时间内,活动已经读取了过时的(以前的)地理位置。 我搜索了论坛,尝试在新线程中启动 Servive,并使用 Thread.sleep() 在活动线程中引入等待时间。到目前为止没有任何效果。

从我的活动中启动GeoServce.class的相关代码,并阅读Shared 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                   
              
    );

这是我将地理位置写入 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

这个障碍让我数周以来一直在寻找,如果有任何帮助,我将不胜感激, 谢谢大家!

【问题讨论】:

【参考方案1】:

您有多种选择:

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

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

【讨论】:

以上是关于使用服务中的地理位置更新活动时的时序问题(使用共享首选项将地理位置从服务传输到活动)的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在后台或暂停时的位置更新

如何在应用程序处于后台时保持GPS接收器位置更新(Google Play服务位置API)

iOS 8 中的定位服务进入“非活动”状态

不同活动的片段之间的共享元素转换

未在服务中获取共享首选项的更新值

如何从后台服务android更新谷歌地图v2位置