从 Android 后台服务问题获取当前位置
Posted
技术标签:
【中文标题】从 Android 后台服务问题获取当前位置【英文标题】:Get Current Location From Android Background Service Issue 【发布时间】:2013-05-06 12:26:37 【问题描述】:我想开发基于位置的提醒应用程序。因此,即使应用程序未运行,我也想使用 android 服务获取当前位置。但我没有这样做。我在 android 服务类中设置了计时器,但我不知道如何在服务类中获取当前位置。问题是什么 ?我遇到了这样的错误:
无法在未调用 looper.prepare() 的线程内创建处理程序
public class TrackerService extends Service
double latShared;
double lngShared;
double latService;
double lngService;
private LocationManager lm;
Timer timer;
Handler handler;
final static long TIME = 15000;
SharedPreferences mSharedPrefs;
SharedPreferences.Editor mPrefsEditor;
@Override
public IBinder onBind(Intent intent)
// TODO Auto-generated method stub
return null;
@Override
public void onCreate()
mSharedPrefs = getSharedPreferences("locationXML", MODE_PRIVATE);
latShared = (double)mSharedPrefs.getFloat("lat", 0);
lngShared = (double)mSharedPrefs.getFloat("lng", 0);
timer = new Timer();
timer.schedule(new TimerTask()
@Override
public void run()
LocationUpdates();
,0,TIME);
public void LocationUpdates()
locListener locList = new locListener();
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locList);
@Override
public void onDestroy()
//lm.removeUpdates(this);
timer.cancel();
public class locListener implements LocationListener
@Override
public void onLocationChanged(Location location)
latService = location.getLatitude();
lngService = location.getLongitude();
@Override
public void onProviderDisabled(String provider)
@Override
public void onProviderEnabled(String provider)
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
【问题讨论】:
您可以在 onResume() 中对位置更新请求使用 like 调用请求,并在 onpause() 中删除更新调用。 【参考方案1】:LocationManager.requestLocationUpdates
应该在 UI 线程 上运行,正如其 sibling 方法所定义的那样。另一方面,TimerTask
引入了一个新线程来卸载其执行。
但是,如果您没有为您的服务使用新流程,则只需调用LocationUpdates()
,如下所示:
@Override
protected void onCreate()
mSharedPrefs = getSharedPreferences("locationXML", MODE_PRIVATE);
latShared = (double)mSharedPrefs.getFloat("lat", 0);
lngShared = (double)mSharedPrefs.getFloat("lng", 0);
final Handler h = new Handler();
h.post(new Runnable()
@Override
public void run()
LocationUpdates();
h.postDelayed(this, TIME);
);
或者,如果您不想使用处理程序,那么只需升级您的requestLocationUpdates
,如下所示:
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locList, getMainLooper());
在上述情况下,getMainLooper()
将从 UI 线程调度您的位置更新。
【讨论】:
以上是关于从 Android 后台服务问题获取当前位置的主要内容,如果未能解决你的问题,请参考以下文章
将 Gps 作为后台服务运行并将接收到的当前位置数据与 Sqlite 中的值进行比较?