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();//记得释放
网友评论