2013-05-20 32 views
0

任何人都可以描述或指出我對「如何在Android中起作用」的一個很好的描述?你可以忘記它的Android標準文檔。WakeLock如何工作?對我來說它不起作用

我有一個服務(作爲前臺開始),並在服務中自己的線程將啓動。線程保持循環,直到用戶停止服務。在循環中,線程執行HTTP請求。從線程知道什麼延遲(1分鐘或更長)後,應該執行下一個HTTP請求。

當顯示器打開時,HTTP請求會在確切的預期時間內到達服務器。但是當顯示屏關閉時,延遲是隨機的。例如。事實上在2分21秒,4點04分,4點40分......的1分鐘的情況下......但是,在顯示器關閉的情況下(假設被稱爲深度睡眠模式),我還需要準確的時間。

於是我介紹了wakelock.acquire()之前和wakelock.release之後的HTTP請求,但是這個沒什麼變化。

但它給我的只是一般性的問題:

到底如何將我的代碼起牀做wakelock.acquire()的時候,手機睡覺?如果我達到wakelock.acquire(),那麼我不需要它,或...?

好吧然後我想,也許在深度睡眠我的代碼也執行,但某些事情如IP流量不是。但是,它應該工作。

從logcat日誌中我可以看到wakelock.acquire()沒有及時調用。那麼它的用法是什麼?啓動服務或其線程時,我無法執行wakelock.acquire(),因爲這意味着即使我只想在30分鐘內完成HTTP請求,我的服務也會阻止手機進入睡眠狀態。

我寧願不相信用wakelock.acquire()你只能在整個生命週期內提供服務,防止手機進入深度睡眠狀態。

+0

嘿,也許我完全錯了,並與wakelocks我只能防止手機深度睡眠,但我不能喚醒手機深度睡眠。 但是,這不正常的情況下,你需要喚醒手機一段時間做一些事情? 另一個問題是,爲什麼http請求在深度睡眠中完全執行。我的服務是否會獲得一些處理時間,因爲其他應用喚醒了手機?但是這個應用程序是如何做到的。我希望它也能做到這一點。 – valerian

回答

0

一般來說,喚醒鎖只能讓屏幕或CPU保持打開狀態。當它已經睡着時,它們不會醒來。由於Android在深度睡眠期間的行爲,您可以在創建喚醒鎖來更改此行爲時傳遞ACQUIRE_CAUSES_WAKEUP,但它仍然無法達到您想要的效果。從本質上講,您對Wakelock.acquire()的調用總是會發生得太晚,因爲Android處於睡眠模式的行爲 - 它只是在感覺它時才運行您的代碼,因爲它已經睡着了。

由於您希望更新在您處於後臺的特定時間發生,因此您應該使用AlarmManager.set以及ELAPSED_REALTIME_WAKEUP或RTC_WAKEUP標誌之一。如果可以,請使用setInexactRepeating(),請參閱http://www.google.com/events/io/2009/sessions/CodingLifeBatteryLife.html(電池壽命)原因。

相關問題