如何解决Android - 禁用强制 DozeMode 或 AppStandByMode 更新
我有一个应用程序,它使用 ForegroundService
将位置更新发送到服务器。基本上是一个跟踪器。
这个 ForegroundService
有一个 Handler
,它会定期(使用 postDelayed)执行一段代码来发送位置。
当应用程序在前台甚至在后台时,这工作得非常好,但我开始注意到手机锁定时延迟,屏幕关闭约 15 分钟。我的意思是,15 分钟没有用户活动且没有插入充电器。
这是在 Android Q (v10) 设备上发生的。我假设这也会发生在任何运行 Oreo 之后的设备上。
让我们说清楚...我的应用每 30 秒发送一次位置,但是当输入我认为是 DozeMode 或 AppStandByMode 时,它会继续发送位置,但每 2 分钟(或多或少)。如果我打开屏幕或插入充电器,它会立即恢复到 30 秒的速度。这就是让我对 DozeMode 或 AppStandByMode 感兴趣的原因。此外,如果我不碰手机,但插上充电器,则永远不会发生这种情况。
如前所述,我很确定 DozeMode 或 AppStandByMode 正在发挥作用,我知道我可以将我的应用列入白名单以防止这种情况发生。但在继续之前,我想重现这一点,而无需每次想测试我的应用程序的行为时都等待 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 举报,一经查实,本站将立刻删除。