標籤:
轉自: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機制淺析