像健身应用程序中的位置跟踪
Location tracking like in fitness apps
我的目标
以相当高的频率(例如每 30 秒)获取用户位置更新相当长的时间(例如 8 小时),即使应用程序未 运行 在前台运行(意味着 activity位置跟踪开始的地方可能会被破坏)。
问题
我在 Android 应用中发现了很多关于位置跟踪的文章。
较新的通常会解释如何使用 Google Play 服务的位置 API。
问题在于,在大多数情况下,他们演示了与 Activity
和 LocationListener
合作获取位置更新。例如在 Google's tutorial 中。很明显这不是我需要的。长时间 运行ning 后台位置更新的唯一方法是基于服务的定期启动(通过 AlarmManager
)运行,直到它获得足够准确的位置更新。但是,这种方法似乎不适合我需要的频率。
因此,我最终形成了解决该主题的自定义想法,但欢迎您提出批评意见。在这里:
可能的解决方案
MainActivity
- 仅用于 starting/stopping starting/stopping 和 MonitoringService
的跟踪
MonitoringService
- 一个前台服务,从 Google Play 服务到 LocationServices 的整个连接发生。此外,一旦连接,就会调用 requestLocationUpdates
方法,但它的变体带有 PendingIntent
对象。待定意图包含调用 MyWakefulBroadcastReceiver
class 的意图。 此外,该服务持有部分 wake_lock 以防止设备进入睡眠状态并中断接收位置更新。在这里,我不确定持有唤醒锁是否真的有帮助。
MyWakefulBroadcastReceiver
- 扩展 WakefulBroadcastReceiver
,只是通过 startWakefulService
开始 LocationProcessingIntentService
LocationProcessingIntentService
- 处理通过意图传递给它的位置更新。网络通信在这里进行。因此,它是在单独的服务中完成的,而不是直接在 MonitoringService
目前,我在MonitoringService
中没有获取部分唤醒锁就实现了上述解决方案。当连接到 Android Studio 中的调试器时,我看到了位置更新的处理工作。但是,我不确定它会在例如之后做什么。在没有连接到笔记本电脑的情况下 运行宁 4 小时(好像是为了调试目的)
问题
- 从architecture/performance/battery生活的角度来看,这种方法是否可行?
- 我应该使用唤醒锁来确保设备不会进入睡眠状态吗?
- 如果对 2. 的回答是肯定的,我还需要使用
WakefulBroadcastReceiver
来启动 IntentService
处理位置更新吗?
- 还有其他推荐吗?
你所拥有的大部分都很好。您不需要 MonitoringService
。 PendingIntent
将唤醒您的 BroadcastReceiver
,无论您的应用处于何种状态。您不需要永久唤醒锁。只需在设置中使用 PendingIntent
Activity 到 requestLocationUpdates
.
请记住,定位服务已经 运行 在后台运行(只要用户启用了定位服务),因此您无需 运行 永久唤醒锁定服务也(你可以在 BroadcastReceiver#onReceive()
后唤醒锁,但不要忘记在处理后释放唤醒锁)。
您可能唯一需要担心 PendingIntent
没有唤醒您的 BroadcastReceiver
的情况是用户强制停止您的应用程序。在这种情况下,您可以选择尊重用户的决定。您还可以探索使用 intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
应该将您的 BroadcastReceiver
从停止状态唤醒,但我没有在这种情况下测试此标志。
我的目标
以相当高的频率(例如每 30 秒)获取用户位置更新相当长的时间(例如 8 小时),即使应用程序未 运行 在前台运行(意味着 activity位置跟踪开始的地方可能会被破坏)。
问题
我在 Android 应用中发现了很多关于位置跟踪的文章。 较新的通常会解释如何使用 Google Play 服务的位置 API。
问题在于,在大多数情况下,他们演示了与 Activity
和 LocationListener
合作获取位置更新。例如在 Google's tutorial 中。很明显这不是我需要的。长时间 运行ning 后台位置更新的唯一方法是基于服务的定期启动(通过 AlarmManager
)运行,直到它获得足够准确的位置更新。但是,这种方法似乎不适合我需要的频率。
因此,我最终形成了解决该主题的自定义想法,但欢迎您提出批评意见。在这里:
可能的解决方案
MainActivity
- 仅用于 starting/stopping starting/stopping 和MonitoringService
的跟踪
MonitoringService
- 一个前台服务,从 Google Play 服务到 LocationServices 的整个连接发生。此外,一旦连接,就会调用requestLocationUpdates
方法,但它的变体带有PendingIntent
对象。待定意图包含调用MyWakefulBroadcastReceiver
class 的意图。 此外,该服务持有部分 wake_lock 以防止设备进入睡眠状态并中断接收位置更新。在这里,我不确定持有唤醒锁是否真的有帮助。MyWakefulBroadcastReceiver
- 扩展WakefulBroadcastReceiver
,只是通过startWakefulService
开始 LocationProcessingIntentService
- 处理通过意图传递给它的位置更新。网络通信在这里进行。因此,它是在单独的服务中完成的,而不是直接在MonitoringService
LocationProcessingIntentService
目前,我在MonitoringService
中没有获取部分唤醒锁就实现了上述解决方案。当连接到 Android Studio 中的调试器时,我看到了位置更新的处理工作。但是,我不确定它会在例如之后做什么。在没有连接到笔记本电脑的情况下 运行宁 4 小时(好像是为了调试目的)
问题
- 从architecture/performance/battery生活的角度来看,这种方法是否可行?
- 我应该使用唤醒锁来确保设备不会进入睡眠状态吗?
- 如果对 2. 的回答是肯定的,我还需要使用
WakefulBroadcastReceiver
来启动IntentService
处理位置更新吗? - 还有其他推荐吗?
你所拥有的大部分都很好。您不需要 MonitoringService
。 PendingIntent
将唤醒您的 BroadcastReceiver
,无论您的应用处于何种状态。您不需要永久唤醒锁。只需在设置中使用 PendingIntent
Activity 到 requestLocationUpdates
.
请记住,定位服务已经 运行 在后台运行(只要用户启用了定位服务),因此您无需 运行 永久唤醒锁定服务也(你可以在 BroadcastReceiver#onReceive()
后唤醒锁,但不要忘记在处理后释放唤醒锁)。
您可能唯一需要担心 PendingIntent
没有唤醒您的 BroadcastReceiver
的情况是用户强制停止您的应用程序。在这种情况下,您可以选择尊重用户的决定。您还可以探索使用 intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
应该将您的 BroadcastReceiver
从停止状态唤醒,但我没有在这种情况下测试此标志。