初学者问题:唤醒锁定

7

我对WakeLock的概念还不熟悉,需要您的帮助。

问题:

  1. 我认为WakeLock是一种锁,当执行代码持有它时,可以防止设备进入睡眠模式。如果设备已经处于睡眠/待机模式,那么代码是否会执行?假设它永远不会获取WakeLock?

  2. 当在后台线程(AsyncTask)中运行一个长时间的任务(大约7-8秒),我是否需要担心持有WakeLock?AsyncTask是否已经为我获取了它?

  3. 欢迎提供关于WakeLock的官方文档和写作链接。

谢谢。


我也想知道这个。具体来说,手机在什么情况下会进入睡眠状态?如果我在手机处于唤醒状态时启动一个连续的活动(例如上传文件),那么我的进程在工作时手机是否有可能进入睡眠状态? - Timmmm
2个回答

4

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

AlarmManager类文档中可以看到:

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

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

来自AsyncTask文档:

AsyncTask使UI线程的使用变得正确和容易。这个类允许在UI线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。

3.我建议您阅读Power Manager的官方文档,该文档很好地介绍了WakeLock的概念。


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

基本上,你只有在以下两种情况下需要担心 WakeLocks:如果你期望你的任务会被睡眠打断(例如,如果你设置了一个闹钟来短暂唤醒手机),或者如果你绝对不能让任务中断。否则,只需确保你优雅地处理任何中断即可。


我的测试表明,您可以使用闹钟来触发服务,因此根本不需要广播接收器。如果我对此有误,请有人纠正我(也许它只适用于某些操作系统版本)。同时,请参阅https://github.com/commonsguy/cwac-wakeful#readme,了解保持设备保持唤醒状态直到完成任务的服务的讨论。 - Edward Falk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接