【问题标题】:How WakeLock works in general? For me it does not workWakeLock 一般如何工作?对我来说它不起作用
【发布时间】:2013-05-20 14:01:03
【问题描述】:

谁能描述或指出一个很好的描述“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(),您只能在其整个生命周期内提供服务,从而防止手机进入深度睡眠状态。

【问题讨论】:

  • 嘿,也许我完全错了,使用唤醒锁我只能阻止手机进入深度睡眠,但我无法将手机从深度睡眠中唤醒。但这不是正常情况,您需要唤醒手机一段时间才能做某事吗???另一个问题是,为什么在深度睡眠中执行 http 请求。我的服务是否需要一些处理时间,因为其他一些应用程序唤醒了手机?但是这个应用程序是如何做到的。我希望它也这样做。

标签: android multithreading service foreground wakelock


【解决方案1】:

一般来说,唤醒锁只会让屏幕或 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 了解原因(电池寿命)。

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2011-04-03
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多