文章爲轉載;http://landerlyoung.github.io/blog/2014/10/31/androidzhong-de-wakelockshi-yong/
android系統在手機屏幕鎖定之後一般會讓手機休眠,以提高電池的使用時間。但是休眠意味着CPU頻率降低,有時候可能需要做一些需要大量運算的任務,所以需要喚醒CPU。WakeLock可以做到這一點。
WakeLock的創建是:
1 2 3 4 5 |
|
另外如果要使用WakeLock需要在Manifest中添加如下權限
<uses-permission android:name="android.permission.WAKE_LOCK" />
WakeLock的等級
上面的第一個參數是WakeLock levelAndFlag,分別代表了一種WakeLock等級,並且可以通過「或」位操作組合使用。他們是:
-
PARTIAL_WAKE_LOCK:保證CPU保持高性能運行,而屏幕和鍵盤背光(也可能是觸摸按鍵的背光)關閉。一般情況下都會使用這個WakeLock。
-
ACQUIRE_CAUSES_WAKEUP:這個WakeLock除了會使CPU高性能運行外還會導致屏幕亮起,即使屏幕原先處於關閉的狀態下。
-
ON_AFTER_RELEASE:如果釋放WakeLock的時候屏幕處於亮着的狀態,則在釋放WakeLock之後讓屏幕再保持亮一小會。如果釋放WakeLock的時候屏幕本身就沒亮,則不會有動作。
被棄用的WakeLock:
-
SCREEN_DIM_WAKE_LOCK:保證屏幕亮起,但是亮度可能比較低。同時鍵盤背光也可以不亮。
-
SCREEN_BRIGHT_WAKE_LOCK :保證屏幕全亮,同時鍵盤背光也亮。
-
FULL_WAKE_LOCK:表現和SCREEN_BRIGHT_WAKE_LOCK 類似,但是區別在於這個等級的WakeLock使用的是最高亮度!
這三個Level在API17被棄用。被棄用說明肯定有替代品嗎,上面三個類型的作用無非就是保持屏幕長亮。所以推薦是用WindowFlagWindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
。使用方法是:
-
在Activity中:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-
甚至可以在佈局中添加這個屬性:
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:
-
void acquire()
:獲得WakeLock -
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的幾個實用方法
-
boolean PowerManager::isScreenOn ()
判斷屏幕是否亮着(不管是暗的dimed還是正常亮度),在API20被棄用,推薦boolean PowerManager::isInteractive ()
-
void PowerManager::goToSleep(long time)
time是時間戳,一般是System.currentTimeMillis()+timeDelay。強制系統立刻休眠,需要Manifest中添加權限"android.permission.DEVICE_POWER"
。按下電源鍵鎖屏時調用的就是這個方法。 -
void PowerManager::wakeUp(long time)
與上面對應。參數含義,所需權限與上同。按下電源鍵解鎖屏幕時調用的就是這個方法。 -
void PowerManager::reboot(String reason)
重啓手機,reason是要傳給linux內核的參數,比如“recovery”重啓進recovery模式,“fastboot”重啓進fastboot模式。需要權限"android.permission.REBOOT"
。