【发布时间】:2021-03-12 02:48:47
【问题描述】:
我有一个应用程序使用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
虽然我没有进入这种模式,但现在看来我是而且我无法摆脱它......查看更新
更新
起初我以为我没有进入打盹模式...现在我可以确认我进入了,但它总是立即触发。 (不再等待那 15 分钟)
每当我锁定手机并且屏幕熄灭时,它都会自动进入打盹模式并开始间隔位置更新。我插上充电器,然后在 30 秒后再次发送。
我试过了:
adb shell dumpsys deviceidle unforce
adb shell dumpsys deviceidle 禁用
adb shell dumpsys 电池重置
还是一样。
还有:
- 手机关机并重新开机
- 卸载应用程序
- 在应用设置中将电池优化更改为 NOT OPTIMZE
我错过了一步吗?
【问题讨论】:
-
@KuLdipPaTel,我不明白这怎么可能是解决方案
标签: android android-doze battery-saver android-doze-and-standby android-appstandby