我是WakeLock概念的新手,需要你的帮助。
问题:
我假设WakeLock是某种类型的锁,当执行代码持有时会阻止设备休眠。如果设备已处于睡眠/待机模式,那么代码会执行吗?假设它永远不会获得WakeLock?
当在后台线程(AsyncTask)中完成一个长时间运行的任务(abt 7-8秒)时,我是否应该为持有WakeLock而烦恼? AsyncTask是否已经为我获取了它?
官方文件的链接和唤醒锁上的文章表示赞赏。
感谢。
答案 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)
通常,手机正在睡眠时运行的唯一代码是BroadcastReceiver
。实际上,手机会唤醒一秒钟,运行BroadcastReceiver
的代码然后再次睡觉。因为你永远不应该在BroadcastReceiver
中运行长代码(用它来代替启动Service
),你基本上可以假设你的代码永远不会在手机休眠时运行。当然,如果您使用BroadcastReceiver
来启动Service
,通常应该获得一个WakeLock。
如果用户启动AsyncTask
,您根本不需要担心WakeLocks。手机在运行时不太可能会睡觉。我不确定他们是否有WakeLock,但是在运行标准AsyncTask
时让我的手机进入睡眠状态似乎并没有打断它。
正如SteD所说,请查看:http://developer.android.com/reference/android/os/PowerManager.html
基本上你唯一需要担心WakeLocks的时候就是你要么想要让你的任务被睡眠中断(如果你设置一个警报器会短暂地唤醒手机),或者你绝对没有任务中断。否则,只需确保妥善处理任何中断。