1.PowerManager.WakeLock
- 獲取PowerManager實例:
getSystemService(Context.POWER_SERVICE); - 獲取WakeLock實例:
mWakeLock = powerManager.newWakeLock(int levelAndFlags, String tag);
levelAndFlags:WakeLock的級別,對應不同的cpu,屏幕和鍵盤燈的表現
tag: debug用的
mWakeLock.acquire(); - 釋放WakeLock:
mWakeLock.release(); - WakeLockLevel:
Flag Value | CPU | Screen | Keyboard |
---|---|---|---|
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 |
兩個特殊的flag(只作用于屏幕,且與PARTIAL_WAKE_LOCK一起使用時無效):
ACQUIRE_CAUSES_WAKEUP:普通的鎖只能在亮屏時保持不滅,而該鎖可讓屏幕在滅屏情況下立即亮屏
ON_AFTER_RELEASE:當鎖釋放時用戶activity計時器會被重置,導致照明持續一段時間后再滅屏
PARTIAL_WAKE_LOCK: 保證CPU運行,允許滅屏,允許關閉鍵盤燈;唯一能夠在滅屏下讓CPU運行的鎖;
SCREEN_DIM_WAKE_LOCK: 亮屏,但會變暗,允許關閉鍵盤燈;
SCREEN_BRIGHT_WAKE_LOCK: 亮屏,且保持全亮,允許關閉鍵盤燈;
FULL_WAKE_LOCK: 保持屏幕常亮,鍵盤燈常亮;
后面三個flag在 API 17 以后已經棄用,替代他們的是FLAG_KEEP_SCREEN_ON
FLAG_KEEP_SCREEN_ON:只要窗口可見,則保持不滅;無需權限。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);權限:
<uses-permission android:name="android.permission.WAKE_LOCK" />注意:WakeLock的設置是 Activiy 級別的,不是針對整個Application應用的。
2.KeyguardManager.KeyguardLock
獲取KeyguardManager實例
mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);獲取KeyguardLock實例
mKeyguardLock = mKeyguardManager.newKeyguardLock(String tag);在解鎖屏幕
mKeyguardLock.disableKeyguard(); //如果已鎖,則立馬解鎖;如果未鎖,則一直保持不鎖,直到調用reenableKeyguard();在解鎖的情況下允許鎖屏:
mKeyguardLock.reenableKeyguard();//重新啟用鍵盤鎖,與disableKeyguard()對應。權限:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />注意:在設置了密碼鎖的情況下,該方法不能直接解鎖。
3.總結
-
如果想要在鎖屏黑屏下立即解鎖并亮屏:
mWakeLock = powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP,"TAG");
mWakeLock.acquire();//點亮屏幕
mKeyguardLock.disableKeyguard();//解鎖屏幕//對應的釋放: mWakeLock.release(); mKeyguardLock.reenableKeyguard();
如果想要讓手機在滅屏下還能保持cpu工作(比如timer,handler等):
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"TAG");
mWakeLock.acquire();//記得釋放