20

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

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

现在,我到处读到,当屏幕关闭和 CPU 休眠时,某些设备无法按预期工作,大多数情况下使用加速度计。现在我的问题是,我是否需要获取一个WakeLock以便在我的活动打开时 CPU 不会休眠?我真的很想知道这一点,因为正如我之前所说,我不想通过购买昂贵的WakeLock.

我希望一个真正知道这是如何工作的人的详细答案。

4

1 回答 1

26

您的目标无法通过您的方法稳定实现。如果您使用 Handler 的postDelayed()方法并且 CPU 进入 deepsleep,则 ms 计数器将停止,并且只有在 CPU 再次唤醒时才会继续。

有关更多详细信息,请参阅此。

因此,如果您想要某种 cron 作业,您将需要使用唤醒锁。幸运的是,有一个服务实现可以做到这一点:Wakeful IntentService

从文档:

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

于 2013-06-29T14:27:45.587 回答