1. 程式人生 > >【轉】PowerManager 與 WakeLock

【轉】PowerManager 與 WakeLock

tro com 小說 training 筆記 keep 鍵盤 lse 工作

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 ValueCPU屏幕鍵盤
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