我有一个使用 aForegroundService
将位置更新发送到服务器的应用程序。基本上是一个跟踪器。
这ForegroundService
有一个Handler
定期(使用postDelayed)执行一段代码来发送位置。
当应用程序处于前台甚至后台时,这工作得非常好,但我开始注意到手机锁定时出现延迟,屏幕关闭大约 15 分钟。我的意思是,15 分钟没有用户活动,也没有插入充电器。
这发生在Android Q (v10)设备上。我假设这也会发生在任何运行 Oreo 的设备上。
让我们说清楚......我的应用程序每 30 秒发送一次位置,但是当输入我认为是DozeMode或AppStandByMode时,它会继续发送位置,但每 2 分钟(或多或少)。如果我打开屏幕或插入充电器,它会立即恢复到 30 秒的速度。这就是让我对DozeMode或AppStandByMode 感兴趣的原因。此外,如果我不碰手机,但插入充电器,那么这永远不会发生。
如前所述,我很确定DozeMode或AppStandByMode正在启动,我知道我可以将我的应用列入白名单以防止这种情况发生。但在更进一步之前,我想重现这一点,而无需每次我想测试我的应用程序的行为时等待这 15 分钟。
所以我“用谷歌搜索”了我如何强制这样做,这就是我发现的:
对于DozeMode
(见来源)
adb shell dumpsys 电池拔掉
adb shell dumpsys deviceidle step deep
并继续执行最后一条命令,直到达到IDLE状态。
对于AppStandByeMode
(见来源)
adb shell dumpsys 电池拔掉
adb shell am set-inactive packageName true
并使用其他命令查询状态:
adb shell am get-inactive packageName
我确认它返回Idle=true
我什至也按照其他博客的建议进行操作,发布:
adb shell dumpsys deviceidle force-idle
我虽然我没有进入这种模式,但现在看来我是而且我无法摆脱它......查看更新
更新
起初我以为我没有进入打盹模式......现在我可以确认我进入了,但它总是立即触发。(不再等待那 15 分钟)
每当我锁定手机并且屏幕熄灭时,它会自动进入打盹模式并开始间隔位置更新。我插上充电器,然后在 30 秒后再次发送。
我试过:
adb shell dumpsys deviceidle 解除强制
adb shell dumpsys deviceidle 禁用
adb shell dumpsys 电池重置
还是一样。
还:
- 手机关机和电源备份
- 卸载应用程序
- 在应用程序设置中将电池优化更改为不优化
我错过了一步吗?