2013-06-25 104 views
3

我正在開發一個需要頻繁運行小塊代碼的應用程序(例如每兩秒鐘一次)。我試圖使用簡單的Thread.sleep()(或android.os.SystemClock.sleep()來避免中斷,最後我嘗試了Timer和Handler),但結果是時間程序睡眠是隨機的(或者,如果我使用定時器或處理程序,因爲系統在屏幕關閉時丟棄它們的消息,它就不會運行),因爲系統在屏幕關閉期間進入深度睡眠模式。關閉屏幕的Android Timer/Handler/Thread.sleep()無法正常工作

例如,如果手機插入充電器或正在播放音樂(避免深度睡眠模式),則代碼正常工作,但當手機沒有做任何事情時,時間可能會從兩秒鐘長達幾分鐘的睡眠。

https://groups.google.com/forum/#!topic/android-developers/Eqwp8Uiy2f0似乎唯一的選擇是使用AlarmManager強制喚醒,但這種方式可能會導致電池耗盡。

有沒有其他的選擇?

如果沒有,有什麼方法可以檢測系統何時進入深度睡眠模式?

回答

3

這爲時已晚,但可能對其他人有用。 是的,定時器不能在深度睡眠模式下工作。我認爲沒有比AlarmManager更好的方式來在深度睡眠模式下定期運行某些東西。 此外,由於您的頻率僅爲2秒,因此如果您的要求在時間上至關重要,我認爲您可能需要準確地使用alamrs(setExact()),因爲常規警報可能無法更好地爲您服務。有時甚至setExact可能不會捕獲我觀察到的喚醒鎖。所以你必須獲得你自己的(PARTIAL_ ..)喚醒鎖,並做些東西並釋放鎖。 但是,你必須運行2秒嗎? 如果不繼續使用定時器,定時器將在設備喚醒後自動繼續工作。 看看Should I use AlarmManager or Handler?