【问题标题】:Android Timer/Handler/Thread.sleep() with screen off don't work correctly屏幕关闭的 Android Timer/Handler/Thread.sleep() 无法正常工作
【发布时间】:2013-06-25 08:27:51
【问题描述】:

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

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

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

还有其他选择吗?

如果没有,有什么方法可以检测系统何时进入深度睡眠模式?

【问题讨论】:

    标签: android timer screen handler sleep


    【解决方案1】:

    为时已晚,但可能对其他人有用。 是的,Timers 在深度睡眠模式下不起作用。我认为除了 AlarmManager 之外没有其他更好的方法可以在深度睡眠模式下定期运行某些东西。 此外,由于您的频率仅为 2 秒,我认为您可能必须使用精确的警报(setExact()),因为如果您的要求及时,常规警报可能无法为您提供更好的服务。有时甚至 setExact 也可能无法捕获我观察到的唤醒锁。因此,您必须获取自己的(PARTIAL_..)唤醒锁,然后做一些事情并释放锁。 但是您必须每 2 秒运行一次吗? 如果不继续使用定时器,它将在设备唤醒后自动继续工作。 看看Should I use AlarmManager or Handler?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多