7

我是 WakeLock 概念的新手,需要您的帮助。

问题:

  1. 我假设 WakeLock 是某种类型的锁,当被执行代码持有时,它会阻止设备进入睡眠状态。如果设备已经处于睡眠/待机模式,代码会执行吗?假设它永远不会获得 WakeLock?

  2. 当在后台线程(AsyncTask)中完成长时间运行的任务(大约 7-8 秒)时,我应该为持有 WakeLock 而烦恼吗?AsyncTask 是否已经为我获取它?

  3. 感谢官方文档和唤醒锁文章的链接。

谢谢。

4

2 回答 2

4

1.如果手机处于完全睡眠模式,除了来电外,您可以使用AlarmManager意图唤醒手机。

AlarmManager类文档:

只要警报接收器的 onReceive() 方法正在执行,警报管理器就会持有CPU 唤醒锁。这保证了在您完成广播处理之前手机不会休眠。一旦 onReceive() 返回,警报管理器就会释放这个唤醒锁。这意味着在某些情况下,一旦您的 onReceive() 方法完成,手机就会进入睡眠状态。如果您的警报接收器调用了 Context.startService(),则手机可能会在请求的服务启动之前休眠。为防止这种情况,您的 BroadcastReceiver 和 Service 将需要实施单独的唤醒锁定策略,以确保手机继续运行直到服务可用。

2.如果您正在使用AsyncTask,您将希望将结果发布到 UI 线程onPostExecute()

AsyncTask文档:

AsyncTask 允许正确和轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。

3.我建议你阅读电源管理器的官方文档,它很好地介绍了唤醒锁的概念。

于 2010-11-23T04:08:13.727 回答
3
  1. 通常,在手机睡眠时运行的唯一代码是BroadcastReceiver. 实际上,手机会唤醒一秒钟,运行BroadcastReceiver's 代码并再次休眠。由于您永远不应该在 a 中运行长代码BroadcastReceiver(使用它来启动 a Service),因此您基本上可以假设您的代码永远不会在手机睡眠时运行。当然,如果您使用 aBroadcastReceiver来启动 a Service,您通常应该获得一个 WakeLock。

  2. AsyncTask用户发起,你真的不需要担心 WakeLocks。手机在运行时不太可能进入睡眠状态。我不确定他们是否获得了 WakeLock,但是在运行标准时让我的手机进入睡眠状态AsyncTask似乎并不会中断它。

  3. 正如 SteD 所说,请查看:http: //developer.android.com/reference/android/os/PowerManager.html

基本上,您需要担心 WakeLocks 的唯一时间是当您希望您的任务因睡眠而中断(例如,如果您设置了一个短暂唤醒手机的警报),或者您绝对不能中断任务。否则,只要确保你优雅地处理任何中断。

于 2010-11-23T04:15:49.413 回答