首先看一下Android Powermanager Class Overview,對Android的幾種不一樣的休眠模式有個大體瞭解。服務器
若是不進行特別的設置,Android會在必定時間後屏幕變暗,在屏幕變暗後必定時間內,約幾分鐘,CPU也會休眠,大多數的程序都會中止運行,從而節省電量。但你能夠在代碼中經過對Powmanager API的調用來設置不一樣的休眠模式。網絡
Flag Value CPU Screen Keyboard
PARTIAL_WAKE_LOCK On* Off Off
SCREEN_DIM_WAKE_LOCK On Dim Off
SCREEN_BRIGHT_WAKE_LOCK On Bright Off
FULL_WAKE_LOCK On Bright Brightui
如上表,最高等級的休眠是屏幕,鍵盤等,cpu都所有休眠。能夠設置不一樣的模式,讓其產生不一樣的休眠,好比讓cpu保持運行。
設置代碼以下:this
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); wl.acquire(); ..screen will stay on during this section.. wl.release();
我曾經遇到的幾個坑點及解決:調試
1.向服務器輪詢的代碼不執行。code
曾經作一個應用,利用Timer和TimerTask,來設置對服務器進行定時的輪詢,可是發現機器在某段時間後,輪詢就再也不進行了。查了好久才發現是休眠形成的。後來解決的辦法是,利用系統的AlarmService來執行輪詢。由於雖然系統讓機器休眠,節省電量,但並非徹底的關機,系統有一部分優先級很高的程序仍是在執行的,好比鬧鐘,利用AlarmService能夠定時啓動本身的程序,讓cpu啓動,執行完畢再休眠。get
2.後臺長鏈接斷開。io
最近遇到的問題。利用Socket長鏈接實現QQ相似的聊天功能,發如今屏幕熄滅一段時間後,Socket就被斷開。屏幕開啓的時候需進行重連,但每次看Log的時候又發現網絡是連接的,後來才發現是cpu休眠致使連接被斷開,當你插上數據線看log的時候,網絡cpu恢復,一看網絡確實是連接的,坑。最後使用了PARTIAL_WAKE_LOCK,保持CPU不休眠。class
3.調試時是不會休眠的。
讓我很是鬱悶的是,在調試2的時候,就發現,有時Socket會斷開,有時不會斷開,後來才搞明白,由於我有時是插着數據線進行調試,有時拔掉數據線,這時Android的休眠狀態是不同的。並且不一樣的機器也有不一樣的表現,好比有的機器,插着數據線就會充電,有的不會,有的機器的設置的充電時屏幕不變暗等等,把本身都搞暈了。其實搞明白這個休眠機制,一切都好說了。後臺