1

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

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

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

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

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

如前所述,我很确定DozeModeAppStandByMode正在启动,我知道我可以将我的应用列入白名单以防止这种情况发生。但在更进一步之前,我想重现这一点,而无需每次我想测试我的应用程序的行为时等待这 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 电池重置

还是一样。

还:

  • 手机关机和电源备份
  • 卸载应用程序
  • 在应用程序设置中将电池优化更改为不优化

我错过了一步吗?

4

1 回答 1

0

除了打盹模式,Android 9 通过App Standby Buckets扩展了 AppStandby 的概念。

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

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

您可以使用以下命令设置存储桶并查看您的应用程序的行为: adb shell am set-standby-bucket your.package.name <never/rare>

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

于 2021-03-12T09:00:11.617 回答