【发布时间】:2016-08-12 17:24:41
【问题描述】:
存在许多类似的帖子,但没有一个包含有警报管理器和短周期更新问题的打盹模式。
目标:在 GPS 的帮助下接收周期性中断以更新位置
要求:
- 主要在 GPS 的帮助下定期更新位置,相对精确每分钟 1 次(+- 10 秒)
- 适用于较新的 android 设备(包括打瞌睡)
实际想法:
- 在“Start_Sticky”服务中使用警报管理器。 Thie alarmmanager 每分钟发送一次广播,通知 gps 接收器读取位置并将其发送到服务器。使用 AlarmManager.ELAPSED_REALTIME_WAKEUP 配置 Alarmmanager。
问题:
- 警报管理器不再可靠,因为打瞌睡的功能。当设备处于打瞌睡状态时,不会发送警报管理器。
- 屏幕关闭时我没有收到来自 GPS 的位置更新
有关此问题的其他信息:
- 有多个类似 link 的信息,但在打瞌睡时,alarmmanager 似乎不再可靠 - 意味着此解决方案不再可用。
注意:对于每个应用,setAndAllowWhileIdle() 和 setExactAndAllowWhileIdle() 都不能每 9 分钟触发一次以上的警报。 src
问题:
我需要哪些组件来实现这一点?前台服务、Alarmmanager、Wakelock?
【问题讨论】:
-
“定期更新,相对精确每分钟 1 次(+- 10 秒)”——让用户将您的应用添加到电池优化白名单,或构建您自己的自定义 ROM。 “用户无法终止服务”——构建您自己的自定义 ROM。 “在“Start_Sticky”服务中使用警报管理器。” -- 用户仍然可以通过设置应用程序以多种方式“杀死服务”。 “Wakelock”——GPS 修复需要时间。 AFAIK,您需要保持设备 CPU 连续(或几乎如此)通电。这可能会使您的应用不受用户欢迎。
-
我简化了问题。自定义 ROM 是没有选择的。我的问题主要是定期更新。我不明白为什么这会这么难?
-
“我不明白为什么这会这么难?” -- 因为它对用户的电池寿命不利。太多开发者在后台做了太多用户不喜欢的事情,因此谷歌正在“拧紧螺丝”以防止开发者以这种方式滥用电池,除非用户选择这种行为(将应用添加到电池优化设置中的白名单)。
-
有道理!但是由于 setExactAndAllowWhileIdle 每 9 分钟只运行一次 - 如果没有屏幕,绝对没有办法在 Android 6 上每分钟执行一次 - 对吗?即使应用程序在优化白名单中(这对我们来说是可以接受的,因为用户在使用应用程序时接受了这一点 - 这或多或少是他使用应用程序的核心功能)
-
“即使应用程序在优化白名单中”——AFAIK,这就足够了。但是,除此之外,
AlarmManager在您的场景中很大程度上是不必要的,因为您已经有一个进程正在运行。使用 Java 的ScheduledExecutorService在常规Service中定期获得控制。或者,依靠requestLocationUpdates()(或 Play Services 的位置 API 的等效项)根据需要向正在运行的进程提供更新。
标签: android gps android-wake-lock