0

谁能描述或指出我对“android 中的唤醒锁如何工作”的一个很好的描述?你可以忘记它的 Android 标准文档。

我有一个服务(作为前台启动),并且在服务中将启动一个自己的线程。线程保持循环,直到用户停止服务。在循环中,线程执行 HTTP 请求。从响应中,线程知道应该在什么延迟(1 分钟或更长)之后执行下一个 HTTP 请求。

当显示器打开时,HTTP 请求会在准确的预期时间到达服务器。但是当显示器关闭时,延迟是随机的。例如,在 1 分钟的情况下,实际上是 2:21、4:04、4:40,... 但是,我希望在显示关闭的情况下也有确切的时间(假设称为深度睡眠模式)。

所以我在HTTP请求wakelock.acquire()之前和wakelock.release之后引入了一个,但这并没有改变。

但它只给了我一般性问题:

wakelock.acquire()当手机休眠时,我的代码怎么会醒来?如果我到达wakelock.acquire(),那么我不需要它,或者......?

好的,然后我想,也许在深度睡眠中我的代码也被执行了,但是像 IP 流量这样的某些事情不是。但它应该工作。

从 logcat 日志中我可以看到wakelock.acquire()没有及时调用。那么它的用途是什么?我无法wakelock.acquire()在启动服务或其线程时执行,因为这意味着即使我只想在 30 分钟的时间范围内发出 HTTP 请求,我的服务也会阻止手机进入睡眠状态。

我宁愿不敢相信,和wakelock.acquire()你一起只能做一辈子的服务,防止手机进入深度睡眠。

4

1 回答 1

0

一般来说,唤醒锁只会让屏幕或 CPU 保持开启状态。当电话已经睡着时,他们不会唤醒电话。您可以在创建唤醒锁时传递 ACQUIRE_CAUSES_WAKEUP 以更改此行为,但由于 Android 在深度睡眠期间的行为,它仍然不会执行您想要的操作。从本质上讲,您对 Wakelock.acquire() 的调用总是发生得太晚,因为 Android 在睡眠模式下的行为——它只在感觉像它时运行您的代码,因为它处于睡眠状态。

由于您希望在后台的特定时间发生更新,因此看起来您应该使用 AlarmManager.set 以及 ELAPSED_REALTIME_WAKEUP 或 RTC_WAKEUP 标志之一。如果可以,请使用 setInexactRepeating(),请参阅http://www.google.com/events/io/2009/sessions/CodingLifeBatteryLife.html了解原因(电池寿命)。

于 2013-07-10T23:43:25.860 回答