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

Posted

技术标签:

【中文标题】在后台服务中使用 Google Play Services LocationClient【英文标题】:Using Google Play Services LocationClient in background service 【发布时间】:2013-05-29 22:05:08 【问题描述】:

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

我创建了 locationclient 并连接到 onStartCommand 中的服务

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);

现在的问题是,

    onLocationChanged 方法没有在给定的时间间隔(即 5 分钟或最快的时间间隔 3 分钟)被调用。从我可以看到的日志中,它只被调用了两次或三次,之后它根本没有被调用(我在 1 小时后检查了)。

我上面的代码有什么问题? (我也看不到任何“断开连接”的日志)

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

【问题讨论】:

我遇到了一个非常相似的问题。我已经完成了一个快速而肮脏的服务,它使用 AlarmManager 定期运行,我每次都调用 getLastLocation。该调用显然返回了一个位置,但这个位置永远不会更新。我发现打开谷歌地图应用程序(可能与其他位置感知应用程序一起使用)突然使我的服务更新接收到的位置正常。知道会发生什么吗? getlastlocation 总是使用被动提供者而不是 GPS 或网络提供者,这意味着只有当任何其他应用程序(如谷歌地图)获得最近的位置时,我们的应用程序才会被动地使用相同的位置 您是只想在应用运行时跟踪用户位置还是在后台运行时跟踪用户位置? 要获得一个新的位置更新,您创建一个 setNumUpdates 为 1 的位置请求,按照:developer.android.com/reference/com/google/android/gms/location/… 但如果您由于某种原因根本没有得到“回调”,那可能不是很有用。 您是否检查过您的服务是否还活着并且没有被破坏? 【参考方案1】:

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

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;

【讨论】:

不错的 sn-p 和服务。感谢分享。快速提问 - 您是否始终保持 LocationClient 连接?如果是这样,您是否有任何问题或强制断开连接? 我没有注意到任何强制断开连接的问题。平衡电源的一个缺点是,如果用户进入蜂窝死区,应用程序将停止跟踪位置,直到用户再次获得蜂窝服务。这就是它的工作方式,但在决定高精度和平衡功率时应该考虑到这一点。 @blackcj 在 github 上查看了您的代码.. 有疑问。如何从活动启动和停止后台服务?我想要做的是,如果活动重新启动,我想参考已经在运行的服务。谢谢。 我没想到会这么简单。 locationClient = new LocationClient(this, this, this); !mLocationClient.isConnected() || !mLocationClient.isConnecting() 总是返回 true (我认为)。我相信||应该是&&?

以上是关于在后台服务中使用 Google Play Services LocationClient的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序进入后台时,实时多人 Google Play 游戏服务对等方断开连接

Google Play 服务 - 位置 Xamarin Android

使用 google play 服务和 FusedLocationProviderClient 进行位置更新

怎样彻底删除google服务

当 Google Play 服务无法获得位置修复时,我如何获得通知?

Google Play 服务活动识别断开连接且没有任何错误