WakeLock一般如何运作?对我来说它不起作用

时间:2013-05-20 14:01:03

标签: android multithreading service foreground wakelock

任何人都能描述或指出我对“android中的wakelock如何工作”的良好描述?您可以忘记它的Android标准文档。

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

当显示器打开时,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()你只能在一生中提供服务,防止手机深度睡眠。

1 个答案:

答案 0 :(得分: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了解原因(电池寿命)。