初学者提问:Wakelocks

时间:2010-11-23 03:12:32

标签: android wakelock

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

问题:

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

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

  3. 官方文件的链接和唤醒锁上的文章表示赞赏。

  4. 感谢。

2 个答案:

答案 0 :(得分:4)

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

来自AlarmManager课程文档:

  

警报管理器保持 CPU唤醒   锁定只要报警接收器的   onReceive()方法正在执行。这个   保证手机不会   睡觉直到你完成处理   广播。一旦onReceive()   返回,Alarm Manager发布   这个唤醒锁。这意味着   在某些情况下,手机会尽快睡觉   因为你的onReceive()方法完成了。   如果你的报警接收器叫   Context.startService(),它是可能的   电话会在之前睡觉   请求的服务已启动。至   阻止这个,你的BroadcastReceiver   和服务将需要实施一个   单独的唤醒锁定策略以确保   手机继续运行直到   服务变得可用。

2.如果您使用AsyncTask,则需要将结果发布到onPostExecute()上的UI线程

来自AsyncTask文档:

  

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

3.我建议您阅读Power Manager的官方文档,其中介绍了WakeLock的概念。

答案 1 :(得分:3)

  1. 通常,手机正在睡眠时运行的唯一代码是BroadcastReceiver。实际上,手机会唤醒一秒钟,运行BroadcastReceiver的代码然后再次睡觉。因为你永远不应该在BroadcastReceiver中运行长代码(用它来代替启动Service),你基本上可以假设你的代码永远不会在手机休眠时运行。当然,如果您使用BroadcastReceiver来启动Service,通常应该获得一个WakeLock。

  2. 如果用户启动AsyncTask,您根本不需要担心WakeLocks。手机在运行时不太可能会睡觉。我不确定他们是否有WakeLock,但是在运行标准AsyncTask时让我的手机进入睡眠状态似乎并没有打断它。

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

  4. 基本上你唯一需要担心WakeLocks的时候就是你要么想要让你的任务被睡眠中断(如果你设置一个警报器会短暂地唤醒手机),或者你绝对没有任务中断。否则,只需确保妥善处理任何中断。