【轉】PowerManager 與 WakeLock
PowerManager 與 WakeLock
PowerManager 用來控制設備的電源狀態. 而PowerManager.WakeLock 也稱作喚醒鎖, 是一種保持 CPU 運轉防止設備休眠的方式.
我們經常需要應用保持高亮, 比如看小說. 或者即使屏幕關閉後臺也能保持運行, 比如播放MP3. 這裏就需要使用 PowerManager 的 WakeLock 機制.
如果只是需要保持屏幕開啟, 比如閱讀器應用或者遊戲, 可以在 activity 中使用 FLAG_KEEP_SCREEN_ON. 喚醒鎖更加傾向於後臺服務, 運轉 CPU 在休眠之前完成某些特定任務. 比如下載或者mp3播放.
官方文檔裏也說明了在 activity 裏從不使用喚醒鎖, 只使用 FLAG_KEEP_SCREEN_ON
.
四種喚醒鎖
PowerManager.WakeLock
提供了四種喚醒鎖. 但是除了PARTIAL_WAKE_LOCK
其余都已經在 API level 17 中 deprecated了. 所以盡量只考慮在服務中使用PARTIAL_WAKE_LOCK
, 在 activity 中使用FLAG_KEEP_SCREEN_ON
.
Flag Value | CPU | 屏幕 | 鍵盤 |
---|---|---|---|
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 保持亮度 | Bright 保持亮度 |
請註意, 如果是 PARTIAL_WAKE_LOCK
, 無論屏幕的狀態甚至是用戶按了電源鈕, CPU 都會繼續工作. 如果是其它的喚醒鎖, 設備會在用戶按下電源鈕後停止工作進入休眠狀態.
除了上面四種喚醒鎖, 還有兩種只關乎屏幕顯示方式的 flags
Flag Value | 描述 |
---|---|
ACQUIRE_CAUSES_WAKEUP | 一旦獲得喚醒鎖鎖時,屏幕和鍵盤會立即強制打開 |
ON_AFTER_RELEASE | 釋放喚醒鎖時 activity timer 會被重置, 屏幕將比平時亮的久一點 |
如何使用
首先必須要有使用喚醒鎖的權限
<uses-permission android:name="android.permission.WAKE_LOCK" />
可能還需要:
<uses-permission android:name="android.permission.DEVICE_POWER"/>
在這之前, 請考慮能否使用 WakefulBroadcastReceiver (參考 WakefulBroadcastReceiver 筆記). 它會自動獲得 PARTIAL_WAKE_LOCK 喚醒鎖.
如果不符合情況則手動創建喚醒鎖.
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
// 創建喚醒鎖
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
// 獲得喚醒鎖
wakeLock.acquire();
// 進行一些後臺服務
....
// 釋放喚醒鎖, 如果沒有其它喚醒鎖存在, 設備會很快進入休眠狀態
wakelock.release();
這裏要盡量使用 acquire(long timeout)
設置超時, (也被稱作超時鎖). 例如網絡請求的數據返回時間不確定, 導致本來只需要10s的事情一直等待了1個小時, 這樣會使得電量白白浪費了. 設置超時之後, 會自動釋放已節省點遠.
WakeLock 的兩種模式
- 不計數鎖模式
- 計數鎖模式
通過 setReferenceCounted(boolean value)
來指定. true 計數, false 不計數. 默認為計數機制.
- 如果是不計數模式, 不論之前
acquire()
了多少次, 調用一次release()
就會釋放所有鎖. - 如果是計數模式, 每次調用
acquire()
都會計數 count++,release()
的時候 count 的值必須相同.
參考
- Battery Drain and WakeLocks
- PowerManager API Doc
作者:ChuanDong
鏈接:https://www.jianshu.com/p/48ed37738a9e
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
【轉】PowerManager 與 WakeLock