android之WakeLock機制淺析

來源:互聯網
上載者:User

標籤:

轉自:http://blog.sina.com.cn/s/blog_4ad7c2540101n2k2.html

 

應用程式耗電的實質,是所啟用的硬體在消耗電量。  
手機的耗電單元 
CPU: 應用處理器(Application Processor)和基帶處理器(Base Band) 

Soc(系統級晶片): GPU(圖形處理器), 

Video Codec等 外設:wifi,BT, GPS,LCD等  
耗電情況: 
應用處理器(Application Processor) 40~60mA

GPU開啟時會大於100mA 

基帶處理器(Base Band)3~5mA  

通話時100~200mA 

LCD  100mA 

Wifi   100mA 
BT    60mA  

AP是ARM架構的處理器,用於運行Linux+Android系統;

BP用於運行即時作業系統(RTOS),通訊協議棧運 行於BP的RTOS之上

非通話時間,BP的能耗基本上在5mA左右,而AP只要處於非休眠狀態,能耗至少在50mA以上,執行圖形運算時會更高。另外 LCD工作時功耗在100mA左右,WIFI也在100mA左右。

一般手機待機時,AP、LCD、WIFI均進入休眠狀態,這時Android中應用程式 的代碼也會停止執行,只會有基帶處理器(Base Band)的耗電。 
 
摩托羅拉的裡程碑手機為例,官方的參數如下:

 鋰電池(1400mAh)  通話時間450分鐘   待機時間420小時 
 
也就是說,通話時1400/(450/60) = 186.67mA 

          待機時 1400/420 = 3.33mA  
省電的原則:按需並按最低標準使用硬體  


WakeLock機制:

Android為了確保應用程式中關鍵代碼的正確執行,提供了Wake Lock的API,使得應用程式有許可權通過代碼阻止AP進入休眠狀態。 
WakeLock阻止應用處理器(Application Processor)掛起,確保關鍵代碼的運行,通過中斷喚起應用處理器(Application Processor),可以阻止螢幕變暗。所有的WakeLock被釋放後,系統會掛起。  
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); WakeLock sCpuWakeLock = pm.newWakeLock( 
                PowerManager.FULL_WAKE_LOCK | 
                PowerManager.ACQUIRE_CAUSES_WAKEUP,"okTag"); 

 if (sCpuWakeLock!= null) {          

 sCpuWakeLock.release(); 

          sCpuWakeLock = null; 

}


PARTIAL_WAKE_LOCK:保持CPU 運轉,螢幕和鍵盤燈有可能是關閉的。 
SCREEN_DIM_WAKE_LOCK:保持CPU 運轉,允許保持螢幕顯示但有可能是灰的,允許關閉鍵盤燈 
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 運轉,保持螢幕高亮顯示,允許關閉鍵盤燈 
FULL_WAKE_LOCK:保持CPU 運轉,保持螢幕高亮顯示,鍵盤燈也保持亮度 
ACQUIRE_CAUSES_WAKEUP:不會喚醒裝置,強制螢幕馬上高亮顯示,鍵盤燈開啟。有一個例外,如果有notification彈出的話,會喚醒裝置。 
ON_AFTER_RELEASE:WakeLock 被釋放後,維持螢幕亮度一小段時間,減少WakeLock 迴圈時的閃爍情況
如果申請了partial wakelock,那麼即使按Power鍵,系統也不會進Sleep,如Music播放時 如果申請了其它的wakelocks,按Power鍵,系統還是會進Sleep

但如果不領會Android設計者的意圖而濫用Wake Lock API,為了自身程式在背景正常工作而長時間阻止AP進入休眠狀態,就會成為待機電池殺手。 

 

Alarm Manager 
AlarmManage有一個AlarmManagerService,該服務程式主要維護app註冊下來的各類Alarm,並且一直監聽Alarm裝置,一旦有Alarm觸發,或者是Alarm事件發生,AlarmManagerService就會遍曆Alarm列表,找到相應的註冊Alarm並發出廣播

Alarm Manager會維持一個cpu的wake lock。這樣能保證電話休眠時,也能處理alarm的廣播。一旦alarm receiver的onReceive() 方法執行完,wake lock會迅速被釋放。如果在receiver中開啟一個service,有可能service還沒啟動,wake lock已經被釋放了。所以此時要實現單獨的wake lock策略。

有4種Alarm類型: 
1)RTC_WAKEUP 
在指定的時刻(設定Alarm的時候),喚醒裝置來觸發Intent。

2)RTC 
在一個顯式的時間觸發Intent,但不喚醒裝置。   
3)ELAPSED_REALTIME 
從裝置啟動後,如果流逝的時間達到總時間,那麼觸發Intent,但不喚醒裝置。流逝的時間包括裝置睡眠的任何時間。注意一點的是,時間流逝的計算點是自從它最後一次啟動算起。   
4)ELAPSED_REALTIME_WAKEUP 
從裝置啟動後,達到流逝的總時間後,如果需要將喚醒裝置並觸發Intent。

 

android之WakeLock機制淺析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.