初学者问题:Wakelocks

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

问题:

  1. 我认为WakeLock是某种types的锁,当执行代码持有时会阻止设备进入hibernate状态。 如果设备已经处于睡眠/待机模式,那么代码将会执行呢? 假设它永远不会获得一个WakeLock?

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

  3. 链接官方文件和wakelocks书面表示赞赏。

谢谢。

Solutions Collecting From Web of "初学者问题:Wakelocks"

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

从AlarmManager类文档:

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

2.如果你正在使用一个AsyncTask ,你会想把结果发布到onPostExecute()的UI线程上,

从AsyncTask文档:

AsyncTask支持正确和简单地使用UI线程。 该类允许执行后台操作并在UI线程上发布结果,而不必操作线程和/或处理程序。

3.我build议你在Power Manager官方文档中有一个解释,这个文档给出了WakeLock概念的一个很好的介绍。

  1. 通常,手机在睡眠时运行的唯一代码是BroadcastReceiver 。 事实上,电话醒来一秒钟,运行BroadcastReceiver的代码,再次睡觉。 由于您不应该在BroadcastReceiver运行长代码(而是使用它来启动Service ),所以基本上可以假设您的代码在手机正在hibernate时从不运行。 当然,如果您正在使用BroadcastReceiver来启动一个Service ,您通常应该获得一个WakeLock。

  2. 由用户发起的AsyncTask ,你并不需要担心WakeLocks。 手机在运行时不会睡觉。 我不确定他们是否得到一个WakeLock,但是在运行一个标准的AsyncTask时把我的手机放在睡眠状态似乎不会中断它。

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

基本上唯一一次你需要担心的是WakeLocks,当你或者期望你的任务被睡眠打断(就像你设置了一个闹钟来唤醒电话一样)或者你绝对不能让任务中断。 否则,只要确保你优雅地处理任何中断。