GPS在Android服务中处于睡眠模式

时间:2012-02-25 04:41:04

标签: android service gps

我创建了一个GPS服务,该服务定期读取位置更新。之前有一个问题是GPS在一段时间后处于睡眠模式,之后没有任何位置更新。

现在我已经更改了我的代码,以便定期取消注册并注册GPS位置更新。这解决了我GPS进入睡眠模式的问题,但是创建了一个新问题。那是

我的服务在一段时间后终止。我无法检查原因。请帮助。

以下是一些代码snipplet

@Override
public void onCreate() {
    super.onCreate();
    timer.schedule(checkLocationListener, new Date(), 1000 * 60 * 15);
}

private TimerTask checkLocationListener = new TimerTask() {
    @Override
    public void run() {
        handler.post(new Runnable() {
            public void run() {
                lm.removeUpdates(LocationService.this);
  lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, CommonConstants.GPS_POLL,
                    CommonConstants.GPS_MIN_DIST, LocationService.this);
            }
        });
    }
};



@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(LocationService.class.getSimpleName(), "Start");
    valueMap.put(CommonConstants.STATUS, CommonConstants.STATUS_DROP);
    trackMe();
    new Thread() {
        public void run() {
            while (true) {
                try {
                    String url = DeviceConfig.getMessage();
                    if (url == null) {
                        Thread.sleep(60000);
                        continue;
                    }
                    HttpRequester.getServerResponse(url, null);
                    DeviceConfig.addValue(CommonConstants.SERVER_UPD, "" + System.currentTimeMillis());
                    DeviceConfig.removeMessage();
                } catch (Exception e) {
                    Log.e(LocationService.class.getSimpleName(), "Error", e);
                }
            }
        }
    }.start();
    return (START_NOT_STICKY);
}

private void trackMe() {
    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, CommonConstants.GPS_POLL, CommonConstants.GPS_MIN_DIST,
        this);
    DeviceConfig.addValue(CommonConstants.GPS_STATE, lm.isProviderEnabled(LocationManager.GPS_PROVIDER)
        ? CommonConstants.ON : CommonConstants.OFF);
}

3 个答案:

答案 0 :(得分:1)

您不需要反复注册/取消注册位置更新侦听器,似乎您的服务已停止,因此以粘性模式启动您的服务,这样,服务就可以只显式停止。

答案 1 :(得分:1)

如果您真的希望自己的服务继续运行,则需要将其作为前台服务(请参阅http://developer.android.com/reference/android/app/Service.html#startForeground(int,android.app.Notification))

但为什么不在每次位置更改时使用此http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(long,float,android.location.Criteria,android.app.PendingIntent)来启动服务?

菲尔

答案 2 :(得分:0)

到目前为止,我正在这样做。

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
   CommonConstants.GPS_POLL,CommonConstants.GPS_MIN_DIST, pendingIntent);
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
   CommonConstants.NW_POLL, CommonConstants.NW_MIN_DIST, pendingIntent);

如果您有更好的解决方案,请建议。