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
方法返回的结果。
这里的事情变得有点不清楚
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 上的定期前台位置跟踪的主要内容,如果未能解决你的问题,请参考以下文章