屏幕关闭的 Android Timer/Handler/Thread.sleep() 无法正常工作

标签 android timer screen handler sleep

我正在开发一个需要频繁运行小块代码的应用程序(例如,每两秒一次)。我尝试使用简单的 Thread.sleep() (或 android.os.SystemClock.sleep() 以避免中断,最后我尝试使用 Timer 和 Handler)使其工作,但结果是时间程序休眠是随机的(或者如果我使用 Timer 或 Handler 它根本不会运行,因为系统会在屏幕关闭时丢弃它们的消息),因为系统在屏幕关闭期间进入深度 sleep 模式。

例如,如果我将手机插入充电器或正在播放音乐(避免深度 sleep 模式),代码可以正常工作,但是当手机不做任何事情时,时间可能会从两秒 sleep 增加到几分钟的 sleep 。

来自 https://groups.google.com/forum/#!topic/android-developers/Eqwp8Uiy2f0似乎唯一的选择是使用 AlarmManager 强制唤醒,但这种方式可能会导调用池消耗过多。

还有其他选择吗?

如果不是,有什么方法可以检测系统何时进入深度 sleep 模式?

最佳答案

为时已晚,但可能对其他人有用。 是的,定时器在深度 sleep 模式下不起作用。我认为没有比 AlarmManager 更好的方法来在深度 sleep 模式下定期运行某些东西。 另外,由于您的频率只有 2 秒,我认为您可能需要精确报警 (setExact() ),因为如果您的要求在时间上很关键,那么常规报警可能无法更好地为您服务。有时甚至 setExact 也可能无法捕获我观察到的唤醒锁。所以你必须获得你自己的 (PARTIAL_..) 唤醒锁,然后做一些事情并释放锁。 但是你必须每 2 秒跑一次吗? 如果不继续使用定时器,它将在设备唤醒后自动继续工作。 看看Should I use AlarmManager or Handler?

关于屏幕关闭的 Android Timer/Handler/Thread.sleep() 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17292561/

相关文章:

c# - 在 C# 中下载整个网站

Android 屏幕尺寸 HDPI、LDPI、MDPI

php - 将基于网络的游戏嵌入到 Android 应用程序中

java - if 带有静态变量的 block

Angular2 可观察定时器条件

JavaScript 日期 + 毫秒

php - 如何防止PHP推送的HTML表格超出页面长度

android - 为什么 LayoutInflater 需要上下文?

android - RxJava onBackpressureBuffer 不发射项目

java - 拍摄物体后如何停止定时器功能?