当CPU休眠时,Handler post会不会被解雇?

时间:2013-06-26 15:42:15

标签: android performance battery android-handler android-wake-lock

我有一些Handlers的活动,每隔不超过5分钟执行一次。活动是从BroadcastReceiver启动的,可以在屏幕关闭时启动,等待用户抓取手机并获取用户输入,当发生这种情况时,会调用活动onPause()以确保CPU处于睡眠模式。我没有将活动设置为打开屏幕,因为我想尽可能多地保存电池。

我已经用我的手机对它进行了测试并且效果非常好,而屏幕全部关闭Handlers执行他们必须运行的所有代码。如果我在活动打开时打开和关闭屏幕,一切正常。

现在,我已经到处读到,当屏幕关闭且CPU休眠时,某些设备无法按预期工作,大多数时候都使用加速度计。现在我的问题是,我是否需要获取WakeLock以便CPU在我的活动打开时不会睡觉?我真的很想知道这一点,因为正如我之前所说,我不想通过购买昂贵的WakeLock来“浪费”电池。

我更喜欢一个真正了解其工作原理的人的详细答案。

1 个答案:

答案 0 :(得分:23)

您的方法无法稳定实现您的目标。如果您使用处理程序的postDelayed()方法并且CPU进入深度睡眠状态,则ms计数器将停止,并且只有在CPU再次唤醒时才会继续。

See this for more detail.

因此,如果你想要某种cron工作,你需要使用唤醒锁。 幸运的是,有一个Service实现正是这样做的:Wakeful IntentService

来自doc:

  

Android的推荐模式相当于cron作业和Windows计划任务是使用AlarmManager。当与IntentService结合使用时,这很有效,因为该服务将在后台线程上完成工作,并在没有其他工作要做时关闭。有一个小问题:IntentService不会让设备保持清醒状态。如果警报是WAKEUP变种,则当处理警报的BroadcastReceiver处于onReceive()方法时,手机将自行保持唤醒状态。否则,手机可能会重新入睡。 WakefulIntentService尝试通过将IntentService的易用性与部分WakeLock相结合来解决这个问题。