Android 電源管理 — 喚醒鎖全新上市
大多數人可能都遭遇過手機的電池續航時間較短帶來的尷尬。 這極其令人討厭。 沒電的手機和一塊水泥磚沒什么差別。 一般而言,如果用戶的手機電池無法持續一整天,他們會感到非常不滿。而且,當手機充電時用戶無法使用手機,這同樣會帶來極大的不便。
傳統上需要使用筆記本電腦或 PC 處理的任務,現在借助全新的改進軟件,即使未在桌旁也可使用智能手機進行處理。 但是相比筆記本電腦,智能手機的小外形很大地限制了可容納的電池尺寸。 既要求手機具備筆記本電腦的功能,同時又要求其具備全天候的電池續航能力是難以實現的。
通過采用出色的電源管 理,Android 和其他移動操作系統實現了耐久的電池續航時間。 停止使用手機后不久,顯示器便會關閉,CPU 會進入深度節能狀態,因此在不使用它時僅會消耗極少的電源。 這就是電話在使用時充一次電便能持續使用多日的原因。 借助 Android 的電源管理器,正常計劃是顯示器關閉時 CPU 也關閉。
但是,Android 開發人員能夠(并有權限)阻止 Android 設備進入睡眠模式。 他們可能希望讓 CPU 處于活動狀態 — 即使顯示器關閉。 或者可能他們希望在執行某項活動時阻止顯示器自動關閉。 出于此原因,Google* 在其 PowerManager API 中增加了喚醒鎖。 阻止設備進入睡眠模式的應用可以使用喚醒鎖。 只要系統上有活動的喚醒鎖,設備便無法進入掛起模式,除非釋放喚醒鎖。 使用喚醒鎖時,一定要了解到當您不需要喚醒鎖時,必須將其正確釋放,因為未釋放的喚醒鎖無法進入默認狀態以節能,從而很快便會將設備的電池耗盡。
本文將會為您介紹一些在 Android 4.0 中默認使用喚醒鎖的 Android 應用(和使用模式),以便幫助您了解何時使用此項技術。 然后,將會介紹一個 SDPSamples 集中的示例應用“Wakelocks”,以展示如何編寫喚醒鎖的代碼。
喚醒鎖應用使用情況
借助 Android, 有一種方法可以查看哪些服務啟用了喚醒鎖,阻止系統進入低功耗狀態。 設備上的 /proc/wakelocks 文件列出了定義使用喚醒鎖的服務和驅動程序。 通過監控 /sys/power/wake_lock 文件的內容(需要根訪問),您可以了解 CPU 資源何時啟用了喚醒鎖,以及哪種服務啟用了 wakelock2。 我捕獲了幾種使用案例,其中運行 Android 4.0 的 Galaxy Nexus 上啟用了喚醒鎖,如下所示:
使用的應用 | 執行的操作 | 使用了喚醒鎖的服務 | 運行狀況 |
---|---|---|---|
任意 | 按下 UI Widget(如點擊按鈕或 ListView 項) | PowerManagerService | 啟用并在 5 秒鐘后釋放鎖定 |
地圖/導航 | 啟用地圖或進入導航 | gps-lock | 啟用鎖定并使用 GPS |
YouTube | 觀看流視頻 | PowerManagerService | 在視頻播放的整個過程中一直啟用喚醒鎖 |
Music | 聽音樂 | PowerManagerService | 在音樂播放的過程中一直啟用喚醒鎖 |
表格:一些默認的 Android 應用演示喚醒鎖的使用
YouTube 和 Music 應用能夠很好地展示不同級別的喚醒鎖。 用戶播放視頻時,YouTube 應用將會啟用喚醒鎖。 在播放視頻的整個過程中,顯示器會保持開啟狀態(忽略系統的顯示設置)。 但是,如果用戶在播放過程中按下了電源按鈕,設備將會掛起,這會導致顯示器關閉以及音頻/視頻停止播放。 Music 應用在播放音頻時使用不同的喚醒鎖。 顯示設置無法更改,因此設備的屏幕將會根據用戶的顯示設置來關閉。 顯示器關閉后,喚醒鎖會讓 CPU 保持活動狀態以便音頻能夠繼續播放 — 即使用戶按下了電源按鈕。
選擇喚醒鎖(在執行前)
在了解如何編寫喚醒鎖之前,一定要了解喚醒鎖的種類,以便為您的應用挑選最適合的喚醒鎖。 Android PowerManager API 介紹了多種用于更改設備電源狀態的喚醒鎖標記:
標記值 | CPU | 屏幕 | 鍵盤 |
---|---|---|---|
PARTIAL_WAKE_LOCK | 開啟 | 關閉 | 關閉 |
SCREEN_DIM_WAKE_LOCK | 開啟 | 調暗(Dim) | 關閉 |
SCREEN_BRIGHT_WAKE_LOCK | 開啟 | 調亮(Bright) | 關閉 |
FULL_WAKE_LOCK | 開啟 | 調亮(Bright) | 調亮(Bright) |
表格:?源自 Android PowerManager API。
該 API 突出強調了喚醒鎖會顯著縮短 Android 設備的電池續航時間,因此如果可以避免應盡量減少使用它們。 如果使用,也應盡快將其釋放。
使用喚醒鎖的應用必須申請特別 許可才可執行。 這可通過應用清單文件中的 android.permission.WAKE_LOCK 許可來實現。 也就是說,當用戶通過 Google Play 安裝使用喚醒鎖的應用時,系統會提醒他們該應用包含的特性可能會“Prevent phone from sleeping(阻止手機進入睡眠狀態)”。 如果開發人員希望阻止某個應用的顯示器在特定使用情況下變暗,可采用 Google 另外提供的一種方法,這種方法無需特別許可。 WindowManager 包括一個 FLAG_KEEP_SCREEN_ON 變量,當應用的視圖要阻止界面關閉時可對其進行設置。 建議在顯示控制上使用這種方法,因為其影響在應用內相互獨立。 用戶任務切換到其他應用上之后,WindowManager 將會立刻釋放喚醒鎖。
讓顯示器保持開啟狀態(源自 SDPSamples)
SDPSamples 集的喚醒鎖應用演示了(包括代碼)應用如何使用 Window Manager 而非通過編寫喚醒鎖代碼讓顯示器保持開啟狀態。 啟用喚醒鎖應用后,選擇“Win Man Screen On”列表項。
只要按鈕的狀態顯示“Screen is LOCKED”,界面就會保持開啟狀態。 按鈕的狀態更改為“Screen is UNLOCKED”后,如果超過 5 秒鐘不操作,顯示器將會關閉。
在代碼中,每次按下按鈕且狀態發生改變時,通過設置和釋放當前窗口的 FLAG_KEEP_SCREEN_ON 變量可在 WakeLockActivity.java 中使用 screenLockUpdateState() 函數實現該操作。
public void screenLockUpdateState() {if (mIsDisplayLocked){...// update display stategetWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);} else
{...// update display stategetWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);}
}
編寫喚醒鎖(來自 SDPSamples)
SDPSamples 集中的喚醒鎖應用還包括執行不同喚醒鎖的代碼。 啟動喚醒鎖應用后,從下列四種喚醒鎖中選擇: Power Wake Lock Full、Power Wake Lock Bright、Power Wake Lock Dim 和 Power Wake Lock Partial。 這 4 個列表項對應著 PowerManager API 中介紹的 4 種喚醒鎖標記。 每一項將會分別演示 5 秒內嘗試關閉屏幕時設備如何響應。
通過監控 /sys/power/wake_lock 文件的內容(需要根訪問),您可以看到按下電源按鈕后 PARTIAL_WAKE_LOCK 是唯一仍然有效的喚醒鎖。 其他的喚醒鎖通過多種級別的亮度阻止顯示器關閉。
編寫喚醒鎖的第一步是申請許可,之后才可使用清單 AndroidManifest.xml 內的喚醒鎖:
這一步完成后,便可以創建喚醒鎖對象,包括控制喚醒鎖的獲取()函數和釋放()函數。 WakeLockActivity.java 文件內的編碼很好地展示了該情況:
public void onCreate(Bundle savedInstanceState) {...mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);...mWakeLock = mPowerManager.newWakeLock(mWakeLockState,"UMSE PowerTest");if (mWakeLock != null) {mWakeLock.acquire();... }
}protected void onDestroy() {if (mWakeLock != null) {mWakeLock.release();mWakeLock = null;}...
}
結論
喚醒鎖是 Android 中一款強大的概念,可支持開發人員修改設備的默認電源狀態。 在應用中使用喚醒鎖的風險:它會減少設備的電池續航時間。 使用喚醒鎖的明顯優點可在 Google 提供的多種默認應用中看得到,如道路導航和音樂/視頻播放。 因此,開發人員應自行確定他們的應用模型能否從使用喚醒鎖中得益。