天天看點

【轉】wakelock使用注意事項

一樓:

預設情況下,Android裝置會在一段時間後使螢幕變暗,然後關閉螢幕顯示,最後停止CPU,有時使用者并不希望如此,是以Android提供了WakeLock類讓使用者實作自定義的電源管理,但是如果不合理使用這個功能,應用程式造成的電池電量消耗産生顯著的影響,是以建議當使用者觀看螢幕但是很少與螢幕進行互動時(如看視訊)使用,進而防止螢幕變暗。

二樓:

如果一開始就對Android手機的硬體架構有一定的了解,設計出的應用程式通常不會成為待機電池殺手,而要設計出正确的通信機制與通信協定也并不困難。但如果不去了解而盲目設計,可就沒準了。

首先Android手機有兩個處理器,一個叫Application Processor(AP),一個叫Baseband Processor(BP)。AP是ARM架構的處理器,用于運作Linux+Android系統;BP用于運作實時作業系統(RTOS),通訊協定棧運作于BP的RTOS之上。非通話時間,BP的能耗基本上在5mA左右,而AP隻要處于非休眠狀态,能耗至少在50mA以上,執行圖形運算時會更高。另外LCD工作時功耗在100mA左右,WIFI也在100mA左右。一般手機待機時,AP、LCD、WIFI均進入休眠狀态,這時Android中應用程式的代碼也會停止執行。

Android為了確定應用程式中關鍵代碼的正确執行,提供了Wake Lock的API,使得應用程式有權限通過代碼阻止AP進入休眠狀态。但如果不領會Android設計者的意圖而濫用Wake Lock API,為了自身程式在背景的正常工作而長時間阻止AP進入休眠狀态,就會成為待機電池殺手。比如前段時間的某應用,比如現在仍然幹着這事的某應用。

首先,完全沒必要擔心AP休眠會導緻收不到消息推送。通訊協定棧運作于BP,一旦收到資料包,BP會将AP喚醒,喚醒的時間足夠AP執行代碼完成對收到的資料包的處理過程。其它的如Connectivity事件觸發時AP同樣會被喚醒。那麼唯一的問題就是程式如何執行向伺服器發送心跳包的邏輯。你顯然不能靠AP來做心跳計時。Android提供的Alarm Manager就是來解決這個問題的。Alarm應該是BP計時(或其它某個帶石英鐘的晶片,不太确定,但絕對不是AP),觸發時喚醒AP執行程式代碼。那麼Wake Lock API有啥用呢?比如心跳包從請求到應答,比如斷線重連重新登陸這些關鍵邏輯的執行過程,就需要Wake Lock來保護。而一旦一個關鍵邏輯執行成功,就應該立即釋放掉Wake Lock了。兩次心跳請求間隔5到10分鐘,基本不會怎麼耗電。除非網絡不穩定,頻繁斷線重連,那種情況辦法不多。

【轉自】http://www.dewen.org/q/2227?sort=active

繼續閱讀