即使应用程序未在前台运行(意味着启动位置跟踪的活动可能会被破坏),也会以相当高的频率(例如每30秒)获取相当长时间(例如8小时)的用户位置更新。
我发现很多关于Android应用中位置跟踪的文章。 较新的通常会解释如何使用Google Play服务'位置API。
问题在于,在大多数情况下,他们会在与Activity
和LocationListener
的合作中展示获取位置更新。例如在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小时(就像用于调试目的一样)
WakefulBroadcastReceiver
启动IntentService
处理位置更新?答案 0 :(得分:1)
你所拥有的一切都很好。你不需要MonitoringService
。无论您的应用状态如何,PendingIntent
都会唤醒您的BroadcastReceiver
。你不需要永久的唤醒锁。只需将设置活动中的PendingIntent
用于requestLocationUpdates
。
请记住,位置服务已经在后台运行(只要用户启用了位置服务),因此您也不需要运行永久唤醒锁定服务(您可以在之后唤醒锁定BroadcastReceiver#onReceive()
,但不要忘记在处理后释放唤醒锁。)
如果用户强制停止您的应用,则唯一一次您可能不必担心PendingIntent
不会唤醒您的BroadcastReceiver
。在这种情况下,您可以选择尊重用户的决定。您还可以使用intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
进行探索,该BroadcastReceiver
应该将您的{{1}}从停止状态唤醒,但我还没有在此方案中测试此标记。