在后台服务中使用Google Play服务LocationClient

时间:2013-06-03 17:08:14

标签: android location android-service google-play-services

我的应用程序旨在定期跟踪用户的位置并将其发送到服务器,最近我使用Google Play服务位置API更改了我的代码。

我在onStartCommand

中创建了locationclient并连接到了服务
public int onStartCommand(Intent intent, int flags, int startId) {
    setUpLocationClientIfNeeded();
    if(!mLocationClient.isConnected() || !mLocationClient.isConnecting())
    mLocationClient.connect();
    return START_STICKY;

}

在onConnected方法中,我发送了一个位置请求,

@Override
public void onConnected(Bundle arg0) {
    System.out.println("Connected ...");
    mLocationClient.requestLocationUpdates(REQUEST, this);

}

REQUEST对象是,

 private static final LocationRequest REQUEST = LocationRequest.create()
      .setInterval(5*60*1000)      // 5 minutes
      .setFastestInterval(3*60*1000) // 3 minutes
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

现在的问题是,

  1. onLocationChanged方法不会以给定的间隔调用,即5分钟或最快的间隔3分钟。从我可以看到的日志中,它被调用了两次或三次之后它根本没有被调用(我在1小时后检查)。
  2. 我的上述代码有什么问题? (我也看不到任何“断开连接”的日志)

    1. 为了解决这个问题,我尝试使用alarmmanager定期调用该任务。现在,如何通过Locationclient从广播接收器获取单个位置更新。 (locationclient.getLastlocation()仅返回最后存储的位置,但它没有请求新位置)

1 个答案:

答案 0 :(得分:35)

此处提供后台服务的完整源代码:

https://gist.github.com/blackcj/20efe2ac885c7297a676

尝试将超级调用添加到onStartCommand。

/**
 * Keeps the service running even after the app is closed.
 * 
 */
public int onStartCommand (Intent intent, int flags, int startId)
{
    super.onStartCommand(intent, flags, startId);

    setUpLocationClientIfNeeded();
    if(!mLocationClient.isConnected() || !mLocationClient.isConnecting())
    {
        mLocationClient.connect();
    }

    return START_STICKY;
}