像健身应用程序中的位置跟踪

Location tracking like in fitness apps

我的目标

以相当高的频率(例如每 30 秒)获取用户位置更新相当长的时间(例如 8 小时),即使应用程序未 运行 在前台运行(意味着 activity位置跟踪开始的地方可能会被破坏)。

问题

我在 Android 应用中发现了很多关于位置跟踪的文章。 较新的通常会解释如何使用 Google Play 服务的位置 API。

问题在于,在大多数情况下,他们演示了与 ActivityLocationListener 合作获取位置更新。例如在 Google's tutorial 中。很明显这不是我需要的。长时间 运行ning 后台位置更新的唯一方法是基于服务的定期启动(通过 AlarmManager)运行,直到它获得足够准确的位置更新。但是,这种方法似乎不适合我需要的频率。

因此,我最终形成了解决该主题的自定义想法,但欢迎您提出批评意见。在这里:

可能的解决方案

目前,我在MonitoringService中没有获取部分唤醒锁就实现了上述解决方案。当连接到 Android Studio 中的调试器时,我看到了位置更新的处理工作。但是,我不确定它会在例如之后做什么。在没有连接到笔记本电脑的情况下 运行宁 4 小时(好像是为了调试目的)

问题

  1. 从architecture/performance/battery生活的角度来看,这种方法是否可行?
  2. 我应该使用唤醒锁来确保设备不会进入睡眠状态吗?
  3. 如果对 2. 的回答是肯定的,我还需要使用 WakefulBroadcastReceiver 来启动 IntentService 处理位置更新吗?
  4. 还有其他推荐吗?

你所拥有的大部分都很好。您不需要 MonitoringServicePendingIntent 将唤醒您的 BroadcastReceiver,无论您的应用处于何种状态。您不需要永久唤醒锁。只需在设置中使用 PendingIntent Activity 到 requestLocationUpdates.

请记住,定位服务已经 运行 在后台运行(只要用户启用了定位服务),因此您无需 运行 永久唤醒锁定服务也(你可以在 BroadcastReceiver#onReceive() 后唤醒锁,但不要忘记在处理后释放唤醒锁)。

您可能唯一需要担心 PendingIntent 没有唤醒您的 BroadcastReceiver 的情况是用户强制停止您的应用程序。在这种情况下,您可以选择尊重用户的决定。您还可以探索使用 intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 应该将您的 BroadcastReceiver 从停止状态唤醒,但我没有在这种情况下测试此标志。