我正在后台运行一项读取 GPS/网络位置的服务,需要执行以下操作:
在后台运行而不会在应用程序重新启动时中断,并尽可能保持其活着而不会被杀死(这在 Merlin 的评论的帮助下得到了解决)
在收到新位置时,调用 Web 服务并发送读取的位置
每 60 秒运行一次重复性任务,并将最后一个位置重新发送到 Web 服务。如果用户保持在同一位置,这将有所帮助。
我考虑了一些事情,我不确定我是否理解正确。该服务与主应用程序在同一线程中运行,因此在与 UI 线程相同的线程上将位置发送到服务器可能会触发 UI 冻结,这并不好。此外,我不确定 GPS/网络侦听器是否有自己的线程或使用与应用程序相同的线程。
这是服务的缩短代码,以使事情更清楚:
public class GPSLoggerService extends Service {
@Override
public void onCreate() {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 50, locationListenerNetwork);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 50, locationListenerGps);
scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
updateLocation(lastLocation);
}, 60, 60, TimeUnit.SECONDS);
return START_STICKY;
}
LocationListener locationListenerGps = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
...
}
LocationListener locationListenerNetwork = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
...
}
private void updateLocation(Location readLocation) {
//web service call
String response = WebServiceCalls.updateLocation(readLocation);
//log data in a local Sqlite database
saveLocation(readLocation)
}
我主要关心的是如何处理 updateLocation 调用并将其放在与主应用程序线程不同的线程中。scheduleTaskExecutor 我相信这不是要走的路。有时,即使在我调用 stopService() 之后,服务仍然存在,即使我告诉 TaskExecutor 关闭。我找不到服务没有停止的其他解释。回顾一下:我需要在每次听众收到新位置时发送位置,并每 60 秒重新发送一次。我还需要能够通过取消活动线程来快速停止服务。
你会建议我如何处理我的案子?