在不将应用列入白名单的情况下避免打盹模式

Posted

技术标签:

【中文标题】在不将应用列入白名单的情况下避免打盹模式【英文标题】:Avoiding doze mode without whitelisting the app 【发布时间】:2017-05-19 14:53:30 【问题描述】:

我有一个应用程序,它每 10 秒将位置更新为网络服务。但是,在 API 级别 23 或更高级别的设备上,当打瞌睡模式在 15 分钟后进入不活动状态时,网络连接将丢失,并且应用无法向我的网络服务发送进一步的位置更新。

除了通过请求用户允许忽略电池优化(仅允许每 15 分钟更新一次位置)将应用列入白名单之外,我还有哪些其他选择可以继续获取 GPS 位置更新并能够将它们发送到我的网络服务?

【问题讨论】:

【参考方案1】:

虽然克服打瞌睡模式是非常不道德的,但如果应用程序可以向用户解释电池问题,那么最好将应用程序列入白名单。

另一个选项是保持屏幕打开以避免触发打盹模式。

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

这段代码将保持屏幕开启。确保创建黑色或空白布局,就像 pokemon go 中的省电模式一样。

官方 Doze 文档允许将您的用例列入白名单。检查它here。

【讨论】:

我们可以获取该参考的链接吗?【参考方案2】:

开始时你跑得太频繁了。没有手机甚至可以快速更新位置 - 正常情况下每 30 到 60 秒更新一次。所以 2/3 到 5/6 的更新毫无意义。忽略这一点——如果你在一辆时速 60 英里的汽车里,你不会在 10 秒内改变超过 14 英尺。你在服务器上做的任何事情都需要精确到 14 英尺——手机中的典型 GPS 只能精确到 10 米(超过 30 英尺)。这就是 GPS 更新不频繁的原因之一。

但不,没有。他们实施 Doze 是有原因的。它可以节省电池。他们对其进行了设置,因此您无法在不询问用户是否要烧掉电池的情况下绕过它。我完全理解为什么 15 分钟太慢了,但是你问用户并让他们决定你的应用是否值得。

【讨论】:

我认为 SO 的重点是无论是 10 秒还是一分钟,他们如何在打盹模式下发出网络请求?例如,如果他们正在开发驾驶员导航应用程序。因此是通过发送 GCM 高优先级消息吗? @AshesToAshes 他们要求被列入白名单。他正在努力做到这一点。 (谷歌地图被 OEM 列入白名单)。它过于频繁的部分是我指出了这一点,因此他停止浪费网络带宽和电池电量做无意义的事情。 非常正确,但是解决此问题的答案是否可以将必须​​的应用程序列入白名单 + GCM 消息? @AshesToAshes 如果它被列入白名单,他就不需要 GCM。阅读他的问题 - 他只是想避免要求用户加入白名单。 好的,但是当我请求用户将我的应用列入白名单(如本文:***.com/questions/32316491/…)并且他们授予权限时会发生什么?我能否定期向我的网络服务发送更新?

以上是关于在不将应用列入白名单的情况下避免打盹模式的主要内容,如果未能解决你的问题,请参考以下文章

WCF:使用 JSONP 将来源列入白名单

打盹模式处理

如何将 AWS Beanstalk IP 列入白名单

有没有办法使用 ADB 命令而不是设备策略管理器将应用程序列入锁定任务模式的白名单?

将 Firebase 动态链接中的网址列入白名单

是否可以将 Heroku 应用程序列入白名单?