我对WakeLock的概念还不熟悉,需要您的帮助。
问题:
我认为WakeLock是一种锁,当执行代码持有它时,可以防止设备进入睡眠模式。如果设备已经处于睡眠/待机模式,那么代码是否会执行?假设它永远不会获取WakeLock?
当在后台线程(AsyncTask)中运行一个长时间的任务(大约7-8秒),我是否需要担心持有WakeLock?AsyncTask是否已经为我获取了它?
欢迎提供关于WakeLock的官方文档和写作链接。
谢谢。
我对WakeLock的概念还不熟悉,需要您的帮助。
问题:
我认为WakeLock是一种锁,当执行代码持有它时,可以防止设备进入睡眠模式。如果设备已经处于睡眠/待机模式,那么代码是否会执行?假设它永远不会获取WakeLock?
当在后台线程(AsyncTask)中运行一个长时间的任务(大约7-8秒),我是否需要担心持有WakeLock?AsyncTask是否已经为我获取了它?
欢迎提供关于WakeLock的官方文档和写作链接。
谢谢。
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的概念。
通常情况下,当手机处于睡眠状态时,唯一运行的代码是一个 BroadcastReceiver
。实际上,手机会在短暂唤醒一秒钟后运行 BroadcastReceiver
的代码并再次进入睡眠状态。由于你不应该在 BroadcastReceiver
中运行长时间的代码(应该使用它来启动一个 Service
),因此你可以基本上假定你的代码在手机睡眠时不会被运行。当然,如果你正在使用 BroadcastReceiver
来启动一个 Service
,你通常应该获取一个 WakeLock。
对于由用户启动的 AsyncTask
,你不需要担心 WakeLocks。在它运行时,手机不太可能进入睡眠状态。我不确定它们是否会获取 WakeLock,但是在运行标准的 AsyncTask
时将我的手机置于睡眠状态似乎不会中断它。
如 SteD 所说,请查看这个链接:http://developer.android.com/reference/android/os/PowerManager.html
基本上,你只有在以下两种情况下需要担心 WakeLocks:如果你期望你的任务会被睡眠打断(例如,如果你设置了一个闹钟来短暂唤醒手机),或者如果你绝对不能让任务中断。否则,只需确保你优雅地处理任何中断即可。