Android 上的定期前台位置跟踪

Posted

技术标签:

【中文标题】Android 上的定期前台位置跟踪【英文标题】:Periodic foreground location tracking on Android 【发布时间】:2016-09-01 00:26:19 【问题描述】:

我正在为 android 创建一个自定义 Phonegap 插件,该插件可以在应用程序处于前台和后台时监控位置。关于使用FusedLocationProviderAPI 的谷歌文档非常清楚。到目前为止,我制定的过程如下

确保 API 可用

GoogleApiAvailability api = GoogleApiAvailability.getInstance();
int code = api.isGooglePlayServicesAvailable(ctxt);
return (code == ConnectionResult.SUCCESS); 

定义一个具有分配回调的 LocationListener 来处理 requestLocationUpdates 方法返回的结果。

创建 LocationRequest

这里的事情变得有点不清楚

    setInterval - 应用需要位置更新的时间间隔 setFastestInterval - 如果可用,它将使用更新的时间间隔。 setSmallestDistance & setPriorty - 够清楚 setNumUpdates - 我不清楚这是如何工作的。在两行之间阅读我假设如果我使用 setInterval(60000)setNumUpdates(1000) 系统将在接下来的 6000 分钟内继续发送回位置更新,或者直到应用程序后台/关闭或我/用户取消位置更新.

但这引出了一个问题 - 应用程序需要做什么才能成为一个好公民。我假设必须是这样的

记录由requestLocationUpdates 调用返回的PendingResult。 检测 onPause 事件何时发生 在让应用进入后台之前调用PendingResultt.cancel()

如果有人能评论此工作流程的正确性,我将不胜感激。

一个相关问题 - documentation for PendingResult 状态

调用者或回调接收者有责任释放与返回结果相关的任何资源。

我不清楚他们在这里谈论的是什么资源。 LocationListener.onLocationChanged 事件返回一个 Location 对象,我假设它超出范围时将被垃圾收集。据推测,requestLocationUpdates 返回的 PendingResult 应该被取消,然后在应用程序进入后台时设置为 null。释放资源还有什么需要做的吗?


几个小时后

我创建了两个版本的测试应用

App 1:使用setNumUpdates(10000) 设置LocationRequest。以 App 1:Location is... 的形式弹出关于位置变化的祝酒词 App 2:使用setNumUpdates(1) 设置LocationRequest。以 App 2`:Location is... 形式弹出位置变化的祝酒词

我让两个应用程序同时运行,并借助一个名为FakeGPS 的非常简洁的小应用程序来模拟位置变化。当我进行第一次虚假位置更改时,App1 和 App2 都为我提供了更新。但是,所有后续位置更改仅由 App 1 报告。

通过推断,setNumUpdates 提供了一种定期轮询更新的机制。有点令人困惑的是,即使在应用程序后台运行后更新也会继续 - 尽管我认为这主要是因为它受操作系统的支配,当它认为合适时会杀死它。

但是,以上所有内容均基于经验测试。我发现 setNumUpdates 设置的内容非常少。

【问题讨论】:

App1进入后台时,您是否取消注册了位置更新?如果没有,您将继续接收更新,直到框架检测到更新数量达到 App1 设置的值。 你是对的 - 当应用程序进入后台时,我应该取消注册该位置更新并使用 PendingIntent 代替 LocationListener 设置另一个。我曾尝试通过从 onPause 事件发出 PendingResult.cancel() 来做到这一点,但显然这不是必需的 - 文档建议 FusedLocationAPI.removeLocation...。但是,这仍然不能回答我在这里提出的问题 - 包括我根据经验建立但找不到任何文档的 setNumUpdates 的角色。 【参考方案1】:

对于您的问题,即使应用程序在后台,更新是否会继续: Ans: setNumUpdates 是 1 还是 x,当您的应用程序处于后台并且仍注册更新时,您将获得更新,除非操作系统已杀死您的应用程序以获取内存。 setNumUpdates 的唯一区别是,正如您所说的那样,如果它设置为 1,它将只提供一次更新,除非您再次重新注册。 链接对 setNumUpdates 有足够的定义 https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#public-methods

【讨论】:

以上是关于Android 上的定期前台位置跟踪的主要内容,如果未能解决你的问题,请参考以下文章

如何定期在后台跟踪(如果可能)Android 设备(最新版本)?

Android前台服务不会停止

用于位置跟踪的前台服务与 WorkManager

Android:持续位置更新

背景位置跟踪以计算他们行进的距离和路线图

是否可以使用蓝牙(Android 和 iOS)跟踪手机位置