繁体   English   中英

Kotlin 协程延迟 Android 服务未准确触发

[英]Kotlin Coroutine Delay In Android Service Not Firing Accurately

我有一个 Android 服务在一个单独的进程中运行,它启动一个 Kotlin 协程,其中延迟执行延迟后的工作。 我注意到的是,如果我的目标设备正在使用电池运行并且屏幕已关闭,则延迟不会在指定时间到期。 例如,如果我将延迟设置为 5 分钟(300000 毫秒),并且设备屏幕关闭,让设备静置约 4 分钟,当我打开设备屏幕以查看延迟到期时,它不会在5分钟。 我看到的是,从我重新打开屏幕开始,延迟将在大约 4 分钟后到期。 如果设备屏幕保持打开、手机已连接电源或设备通过远程 ADB 连接到我的开发机器,则延迟确实会正确过期。

似乎这与打瞌睡模式和设备进入省电模式有关,这反过来又会影响延迟的运作方式,但是我找不到有关该主题的任何文档。

我尝试过但没有成功的事情:

  • 改用处理程序(只是为了看看会发生什么)
  • 将服务移至主进程
  • 确保我保持 Wifi 锁(需要其他功能)
  • 确保服务是前台服务(服务中其他长期运行的工作需要)并且已启动

这同样可以在运行 Android 7.0+ 的设备上观察到。

使用协程的代码:

delayedJob =
   CoroutineScope(serviceScope).launch {
      delay(WAIT_TIME_MILLIS)
      doDelayedWork()
   }

我发现了我的问题:我的 WakeLock 逻辑中有一个错误导致无法获取锁; 结果是系统在打瞌睡我的服务,这反过来又导致所有线程/处理程序/协程也被打瞌睡。 希望这有助于其他人看到这种奇怪的行为(在 Android 7.0+ 设备上看到)。

@two1stnamz 感谢分享,很有趣。 我正在努力防止我们的私有商业安全应用程序在 Wear OS 3.0/Android 11 上的三星手表上打瞌睡并运行所有问题。 需要每 30-60 秒可靠地向我们的服务器发送数据。 想到协程。 我已经为屏幕设置了一个唤醒锁,以便在呼入电话时保持打开状态,但很好奇你是否可以分享你的唤醒锁代码以及如何打败打瞌睡? :-) 谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM