Android O 在打盹模式下前台服务未接收位置更新

Posted

技术标签:

【中文标题】Android O 在打盹模式下前台服务未接收位置更新【英文标题】:Foreground service not receiving location updates in Doze mode in Android O 【发布时间】:2017-12-02 08:50:49 【问题描述】:

我有一个需要获取单个位置更新的前台服务。

它由一个特定的广播启动,启动后它只是在我们的后端发出一个请求。当它接收到另一个广播时,它会请求位置更新(一次),执行另一个后端请求,然后自行停止。

编辑:澄清一下,服务本身会执行位置更新和后端请求。在这方面它独立于主应用程序。

这在 Lollipop 和 Marshmallow 上运行良好,无论是在手机处于唤醒状态还是处于打盹模式时。但出于某种原因,在 android O 上,该服务在打盹模式下永远不会获取位置更新。网络工作正常,因为它的第一个请求在这两种情况下都通过。此外,如果我在位置请求运行时唤醒手机,它将获得更新。如果我把它放在维护窗口中也是一样的。

Android O 确实对background location 引入了一些限制,但正如页面所述,前台应用行为(应用可见或前台服务正在运行)应保留并与之前的 Android 版本类似。

这是开发者预览中的问题还是我错过的限制?

【问题讨论】:

澄清一下,网络请求和位置更新请求都是从服务发出的吗? @Noel 是的。它独立于应用程序 【参考方案1】:

看看 LocationUpdatesForegroundService 示例:Code Samples for Android O,也许你做错了什么。

LocationUpdatesForegroundService 示例 - 展示如何使用 前台服务在应用程序活动时获取位置更新 不可见。对于在 Android O 上运行的应用程序(甚至是针对 Android 7.0(API 级别 24)或更低),后台更新受限 每小时只有几次。使用前台服务是一种 接收更频繁的更新。

在 GitHub 上获取它:Java

【讨论】:

我使用的是PendingIntent(当我的服务是后台服务时遗留下来的),我将它替换为LocationCallback 以及服务的Looper,就像他们所做的那样,但它没有修复问题。 我已经测试了代码示例,但它不起作用(设备进入休眠状态时没有位置更新)。任何人都可以使用 adb 强制打瞌睡并进行测试。 ADB 命令是adb shell dumpsys battery unplugadb shell dumpsys deviceidle force-idle 一直在运行前台服务(带有相关通知)的应用程序不受打盹限制。 @VishalKale 我在这里报告了这个问题:issuetracker.google.com/issues/63937937,谷歌似乎已经承认这是一个错误,但由于某种原因,它的优先级很低......等等看:/ @Jukurrpa 感谢您向 Google 报告。给它加星标,让我们看看他们什么时候修复它。这个错误在 M & N 中也存在。由于我们使用的是 Google Play 服务 FusedLocationProvider,他们也许也可以为他们修复它。

以上是关于Android O 在打盹模式下前台服务未接收位置更新的主要内容,如果未能解决你的问题,请参考以下文章

在打盹模式下在前台服务中重复任务

最频繁触发Android接收器?

与设备一起移动时,Android 不会退出打盹模式

打盹模式如何影响后台/前台服务,有/没有部分/全部唤醒锁?

Android 7.0 (Nougat) 打盹模式停止 Web 服务

屏幕关闭时,前台服务未在 Android 7.0+ 中接收位置更新