微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android - 禁用强制 DozeMode 或 AppStandByMode 更新

如何解决Android - 禁用强制 DozeMode 或 AppStandByMode 更新

我有一个应用程序,它使用 ForegroundService 将位置更新发送到服务器。基本上是一个跟踪器。

这个 ForegroundService一个 Handler,它会定期(使用 postDelayed)执行一段代码来发送位置。

当应用程序在前台甚至在后台时,这工作得非常好,但我开始注意到手机锁定时延迟,屏幕关闭约 15 分钟。我的意思是,15 分钟没有用户活动且没有插入充电器。

这是在 Android Q (v10) 设备上发生的。我假设这也会发生在任何运行 Oreo 之后的设备上。

让我们说清楚...我的应用每 30 秒发送一次位置,但是当输入我认为是 DozeModeAppStandByMode 时,它会继续发送位置,但每 2 分钟(或多或少)。如果我打开屏幕或插入充电器,它会立即恢复到 30 秒的速度。这就是让我对 DozeModeAppStandByMode 感兴趣的原因。此外,如果我不碰手机,但插上充电器,则永远不会发生这种情况。

如前所述,我很确定 DozeModeAppStandByMode 正在发挥作用,我知道我可以将我的应用列入白名单以防止这种情况发生。但在继续之前,我想重现这一点,而无需每次想测试我的应用程序的行为时都等待 15 分钟。

所以我“搜索”了如何强制执行此操作,这是我发现的:

对于DozeMode(参见source

adb shell dumpsys 电池拔掉

adb shell dumpsys deviceidle step deep

并继续执行最后一条命令,直到达到IDLE状态。

对于AppStandByeMode(参见source

adb shell dumpsys 电池拔掉

adb shell am set-inactive packageName true

并使用另一个命令查询状态:

adb shell am get-inactive packageName

我确认它返回 Idle=true

我什至按照this other blog的建议去做,发出:

adb shell dumpsys deviceidle force-idle

我虽然没有进入这种模式,但现在看来我无法摆脱它......查看更新

更新

起初我以为我没有进入 DozeMode... 现在我可以确认我进入了,但它总是立即触发。 (不用再等那 15 分钟了)

每当我锁定手机并且屏幕熄灭时,它就会自动进入打盹模式并开始间隔位置更新。我插上充电器,然后在 30 秒后再次发送。

我试过了:

adb shell dumpsys deviceidle unforce

adb shell dumpsys deviceidle 禁用

adb shell dumpsys 电池重置

还是一样。

还有:

  • 关闭手机并重新启动手机
  • 卸载应用
  • 在应用设置中将电池优化更改为 NOT OPTIMZE

我错过了一步吗?

解决方法

除了 Doze 模式外,Android 9 扩展了 AppStandby 的概念,带有 App Standby Buckets

与网络限制一起,处于低优先级桶中的应用会在运行作业、触发警报和接收 FCM 消息的频率上受到影响。

您可以使用以下命令获取应用的当前存储桶: adb shell am get-standby-bucket your.package.name

您可以使用以下命令设置存储桶并查看您的应用的行为方式: adb shell am set-standby-bucket your.package.name

我写了一篇文章,总结了多年来有关后台进程限制的所有变化:https://rotemmatityahu.medium.com/workmanager-does-it-always-manage-to-work-fd8518655052

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。