Android關於PowerManager.WakeLock的使用相關介紹

文章爲轉載;http://landerlyoung.github.io/blog/2014/10/31/androidzhong-de-wakelockshi-yong/

android系統在手機屏幕鎖定之後一般會讓手機休眠,以提高電池的使用時間。但是休眠意味着CPU頻率降低,有時候可能需要做一些需要大量運算的任務,所以需要喚醒CPU。WakeLock可以做到這一點。

WakeLock的創建是:

1
2
3
4
5
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);

Wakelock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,

        "MyWakelockTag");

另外如果要使用WakeLock需要在Manifest中添加如下權限

<uses-permission android:name="android.permission.WAKE_LOCK" />

WakeLock的等級

上面的第一個參數是WakeLock levelAndFlag,分別代表了一種WakeLock等級,並且可以通過「或」位操作組合使用。他們是:

  1. PARTIAL_WAKE_LOCK:保證CPU保持高性能運行,而屏幕和鍵盤背光(也可能是觸摸按鍵的背光)關閉。一般情況下都會使用這個WakeLock。

  2. ACQUIRE_CAUSES_WAKEUP:這個WakeLock除了會使CPU高性能運行外還會導致屏幕亮起,即使屏幕原先處於關閉的狀態下。

  3. ON_AFTER_RELEASE:如果釋放WakeLock的時候屏幕處於亮着的狀態,則在釋放WakeLock之後讓屏幕再保持亮一小會。如果釋放WakeLock的時候屏幕本身就沒亮,則不會有動作。

棄用的WakeLock:

  1. SCREEN_DIM_WAKE_LOCK:保證屏幕亮起,但是亮度可能比較低。同時鍵盤背光也可以不亮。

  2. SCREEN_BRIGHT_WAKE_LOCK :保證屏幕全亮,同時鍵盤背光也亮。

  3. FULL_WAKE_LOCK:表現和SCREEN_BRIGHT_WAKE_LOCK 類似,但是區別在於這個等級的WakeLock使用的是最高亮度

這三個Level在API17被棄用。被棄用說明肯定有替代品嗎,上面三個類型的作用無非就是保持屏幕長亮。所以推薦是用WindowFlagWindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON。使用方法是:

  1. 在Activity中: getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

  2. 甚至可以在佈局中添加這個屬性:android:keepScreenOn="true"

隱藏的WakeLock:

android中的部分api並不對用戶應用開放,他們通過在註釋中加入{@hide}來註明。但是在SDK提供的源代碼中是可以看到的。

  • WAIT_FOR_PROXIMITY_NEGATIVE:用於和接近傳感器配合使用,來實現電話應用中打電話時可以使屏幕黑掉,手機離開時又能使屏幕亮起來的功能。acqure的時候屏幕會暗下來,release之後屏幕會亮。其值是32(int)。雖然被hide起來,但是感覺這個超實用的好嗎!!!爲啥要hide起來。。。「話說在API21 上終於開放了(開放這麼晚有個屁用啊(╯‵□′)╯︵┻━┻)」經試驗,不過newWakeLock的時候flag直接用32代替是可以創建這個等級的WakeLock的,但是因爲是非開放API,不能保證第三方OEM修改這個代碼實現!因此使用起來並不安全。「說的好像開放的API第三方OEM就不會亂改一樣。。。(╯‵□′)╯︵┻━┻」

WakeLock的使用:

  • 獲取WakeLock:

    1. void acquire():獲得WakeLock

    2. void acquire(long timeOut):獲得WakeLock timeOut時長,當超過timeOut之後系統自動釋放WakeLock。

  • 釋放WakeLock:release()

  • 判斷是否已經獲取WakeLock:boolean isHeld()

  • void setReferenceCounted(boolean value):是否使用引用計數。類似於垃圾回收策略,只是把垃圾回收改成了WakeLock回收。如果value是true的話將啓用該特性,如果一個WakeLock acquire了多次也必須release多次才能釋放掉。但是如果釋放次數比acquire多則會拋出RuntimeException("WakeLock under-locked " + mTag)異常。默認是開啓了引用計數的!

PowerManager的幾個實用方法

  1. boolean PowerManager::isScreenOn ()判斷屏幕是否亮着(不管是暗的dimed還是正常亮度),在API20被棄用,推薦boolean PowerManager::isInteractive ()

  2. void PowerManager::goToSleep(long time)time是時間戳,一般是System.currentTimeMillis()+timeDelay。強制系統立刻休眠,需要Manifest中添加權限"android.permission.DEVICE_POWER"。按下電源鍵鎖屏時調用的就是這個方法。

  3. void PowerManager::wakeUp(long time)與上面對應。參數含義,所需權限與上同。按下電源鍵解鎖屏幕時調用的就是這個方法。

  4. void PowerManager::reboot(String reason)重啓手機,reason是要傳給linux內核的參數,比如“recovery”重啓進recovery模式,“fastboot”重啓進fastboot模式。需要權限"android.permission.REBOOT"


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章