健身应用中的位置跟踪

时间:2015-10-12 22:33:18

标签: android google-play-services

我的目标

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

问题

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

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

所以,我最终定制了如何解决这个话题的想法,但你的批评会受到欢迎。这是:

可能解决方案的想法

  • MainActivity - 仅用于启动/停止MonitoringService
  • 来启动/停止跟踪
  • MonitoringService - 一个前台服务,整个连接到Google Play服务的LocationServices。此外,一旦连接,调用requestLocationUpdates方法,但其变体具有PendingIntent对象。挂起的intent包含调用MyWakefulBroadcastReceiver类的intent。 此外,该服务还包含部分wake_lock,以防止设备进入休眠状态并中断接收位置更新。在这里,我不确定拿着唤醒锁是否真有帮助。
  • MyWakefulBroadcastReceiver - 展开WakefulBroadcastReceiver,通过LocationProcessingIntentService
  • 启动startWakefulService
  • LocationProcessingIntentService - 处理通过意图传递给它的位置更新。这里进行网络通信。因此,它是在单独的服务中完成的,而不是直接在MonitoringService
  • 中完成

目前,我已经实现了上述解决方案而没有在MonitoringService中获取部分唤醒锁定。当连接到Android Studio中的调试器时,我看到位置更新的处理工作。但是,我不确定它会在例如无需连接笔记本电脑即可运行4小时(就像用于调试目的一样)

问题

  1. 这种方法从架构/性能/电池寿命的角度来看是否正常?
  2. 我应该使用唤醒锁来确保设备不会进入睡眠状态吗?
  3. 如果回答2.是,我是否仍需要使用WakefulBroadcastReceiver启动IntentService处理位置更新?
  4. 还有其他建议吗?

1 个答案:

答案 0 :(得分:1)

你所拥有的一切都很好。你不需要MonitoringService。无论您的应用状态如何,PendingIntent都会唤醒您的BroadcastReceiver。你不需要永久的唤醒锁。只需将设置活动中的PendingIntent用于requestLocationUpdates

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

如果用户强制停止您的应用,则唯一一次您可能不必担心PendingIntent不会唤醒您的BroadcastReceiver。在这种情况下,您可以选择尊重用户的决定。您还可以使用intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);进行探索,该BroadcastReceiver应该将您的{{1}}从停止状态唤醒,但我还没有在此方案中测试此标记。