(转)Android中系统自带的锁:WalkLock、KeyguardLock

Android系统自带了两把锁:

(1)WalkLock:唤醒锁,点亮屏幕用的 ;

(2)KeyguardLock:键盘锁,解锁键盘用的;

WalkLock 唤醒锁

(1)WalkLock真的能点亮屏幕吗?

  答案是肯定的,可是有时候为什么不点亮屏幕,这个就是参数设置的问题了。

  PowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Gank");

  PowerManager.ACQUIRE_CAUSES_WAKEUP 关键是这个参数的理解。

  

  WalkLock点亮屏幕并非真的去点亮了屏幕,你可以理解为,它通过Android组件(Activity)去点亮了屏幕。

  假如有一个通知(notication)想去点亮屏幕,那么问题来了,它能点亮吗?肯定不行。

  不过拥有这个PowerManager.ACQUIRE_CAUSES_WAKEU参数,你就可以点亮屏幕了。它使WalkLock不再依赖组件就可以点亮屏幕了。

相关参数说明

PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。

SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯

SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯

FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度

ACQUIRE_CAUSES_WAKEUP:Normal wake locks don‘t actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately.

ON_AFTER_RELEASE:this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to reduce flicker if you are cycling between wake lock conditions.

(2)WalkLock如何获得屏幕的状态?

  PowerManager.isScreenOn()方法;这个方法返回true: 屏幕是唤醒的 返回false:屏幕是休眠的

(3)WalkLock唤醒和休眠的方法?

  WalkLock.aquire() 在屏幕休眠的状态下唤醒屏幕

  WalkLock.release() 在屏幕点亮的状态下,使屏幕休眠。

  WalkLock.release()这个方法有个需要注意的地方:

  例如:WalkLockA对象先唤醒了屏幕再使屏幕休眠,ok没问题

  屏幕本身就是唤醒状态,WalkLockA对象没有唤醒过屏幕,WalkLockA对象如果尝试使屏幕休眠。会产生一个异常 UnLock Sreen。

KeyguardLock 键盘锁

(1)KeyguardLock获得当前屏幕是否解锁?

  KeygroundManager.inKeyguardRestrictedInputMode() 返回true表示键盘锁住, 返回false表示键盘解锁中

(2)KeyguardLock给屏幕解锁和上锁?

  KeyguardLock.disableKeyguard()解锁键盘

  KeyguardLock.reenableKeyguard()锁键盘

  KeyguardLock没有上面唤醒锁的问题,就是说无论你的键盘是否由KeyguardLockA解锁,你调用KeyguardLockA对象的reenableKeyguard()方法都不会有异常。

这两把锁一些概念性的理解,假如你认为你获得了一个键盘锁对象,你就可以锁屏幕了。这个就大错特错了。

你锁不了其他程序打开的屏幕(如果可以的话,一个for循环一直锁你屏幕,你哭都没眼泪)

你可以控制自己的锁,别想着别人的锁。

总结:
  一般这两把锁都是配合使用的,你解锁屏幕的时候肯定不希望屏幕漆黑一片。关闭键盘锁的时候希望屏幕也同时休眠。

问题:
  1:我尝试手动关闭屏幕,可是总继续亮那么一小会。

  2:如果手机自动关闭屏幕的话,不会有这个问题。

public void unlockScreen() {
        // 获取PowerManager的实例
        PowerManager pm = (PowerManager) mContext
                .getSystemService(Context.POWER_SERVICE);
        // 得到一个WakeLock唤醒锁
        mWakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
                | PowerManager.ACQUIRE_CAUSES_WAKEUP
                | PowerManager.ON_AFTER_RELEASE, "SimpleTimer");
        if (!mWakelock.isHeld()) {
            // 唤醒屏幕
            mWakelock.acquire();
        }

        // 获得一个KeyguardManager的实例
        km = (KeyguardManager) mContext
                .getSystemService(Context.KEYGUARD_SERVICE);
        // 得到一个键盘锁KeyguardLock
        mKeyguardLock = km.newKeyguardLock("SimpleTimer");
        if (km.inKeyguardRestrictedInputMode()) {
            // 解锁键盘
            mKeyguardLock.disableKeyguard();
        }
    }

注意:这里使用的mWakelock.isHeld())来判断屏幕当前是否是休眠状态,从Android 2.1 API Level7开始增加了一个判断屏幕是否处于点亮状态可以使用public boolean isScreenOn ()这个方法。
锁屏幕的代码是

    public void lockScreen() {
        // release screen
        if (!km.inKeyguardRestrictedInputMode()) {
            // 锁键盘
            mKeyguardLock.reenableKeyguard();
        }
        // 使屏幕休眠
        if (mWakelock.isHeld()) {
            mWakelock.release();
        }
    }

你需要在AndroidManifest.xml中声明该应用有设置电源管理的权限。

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

提示:添加最后一个权限的时候可能会提示你“Permission is only granted to system apps”,你需要clean一下

转载地址:http://mysuperbaby.iteye.com/blog/1460948

时间: 2024-10-11 23:24:54

(转)Android中系统自带的锁:WalkLock、KeyguardLock的相关文章

android开发中系统自带语音模块的使用

android开发中系统自带语音模块的使用需求:项目中需要添加语音搜索模块,增加用户体验解决过程:在网上搜到语音搜索例子,参考网上代码,加入到了自己的项目,完成产品要求.这个问题很好解决,网上能找到很多的资料,但是没有直接导入工程就能用的例子,我这里写了一个完整的Demo,代码可以直接粘贴到自己项目中去,实现了语音搜索,并将搜索结果展示.语音搜索大致流程:启动系统自带的Intent,Intent参数设置为RecognizerIntent.ACTION_RECOGNIZE_SPEECH,再加上一些

Android调用系统自带的文件管理器进行文件选择

http://blog.csdn.net/zqchn/article/details/8770913的补充 FileUtils文件 public class FileUtils {     public static String getPath(Context context, Uri uri) {         if ("content".equalsIgnoreCase(uri.getScheme())) {             String[] projection =

php7中系统自带异常类和自己创建异常类比较

php7中系统自带异常类和自己创建异常类 1,系统自带异常类 try catch<?phptry{throw new Exception('96net.com.cn',10);}catch(Exception $e){echo $e->getMessage();echo $e->getCode();} 2,自己创建异常类 <?phpclass MyException extends Exception{function demo(){echo "dc3688.com&qu

Android之系统自带的文字外观设置及实际显示效果图 android:textAppearance

xml布局里面设置文字的外观: 如"android:textAppearance="?android:attr/textAppearanceLargeInverse"这里引用的是系统自带的一个外观, ?表示系统是否有这种外观,否则使用默认的外观. 可设置的值如下: textAppearanceButton/   textAppearanceInverse/   textAppearanceLarge/   textAppearanceLargeInverse/  textAp

(转)Android调用系统自带的文件管理器进行文件选择并获得路径

Android区别于iOS的沙盒模式,可以通过文件浏览器浏览本地的存储器.Android API也提供了相应的接口. 基本思路,先通过Android API调用系统自带的文件浏览器选取文件获得URI,然后将URI转换成file,从而得到file. 调用系统自带的文件浏览器 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState

关于oracle中系统自带的emp、dept表查询不带的问题

1.首先emp和dept表是scott用户下的,所以查询时要在scott用户下或者使用scott.emp: 2.如果emp表出来的不是系统自带的内容,而是自己添加的 一些东西,那么emp表已经别自己删掉了: 3.如果查询emp表显示不存在或者只有字段没有数据,那么emp表被自己无意中删掉了或者内容被自己删掉了. 恢复emp表或者dept表的方法: 将\\oracle\app\oracle\product\11.2.0\server\rdbms\admin\(地址前面一段可能有变化,看自己orac

android获取系统自带浏览器书签

刚刚接手一个备份系统浏览器书签的模块,现在把代码贴出来,另外有几点疑问请路过的大神指教 1.根据官方api应该是有以下几个字段是可以获取的 但是除了TITLE和URL能获取其他的都会报java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.异

在Android中使用自带API操作Json

Json简介 JavaScript对象表示法(JavaScript Object Notation) 是存储和交换文本信息的语法 特点 是轻量级的文本数据交换格式 独立于语言和平台 具有自我描述性,更易理解 Json与XML 类似XML,比XML更小.更快.更易解析 没有结束标签 更短 读写的速度更快 使用数组 不使用保留字 Json语法 是JavaScript对象表示法语法的子集 数组在键值对中 数据由逗号分隔 大括号保存对象 中括号保存数组 Json值可以是 数字(整数或浮点数) 字符串(在

Android 调用系统自带应用

Intent跳转到系统应用中的拨号界面.联系人界面.短信界面及其他 现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 首先,我们先看拨号界面,代码如下: Intent intent =new Intent(); intent.setAction("android.intent.action.CALL_BUTTON"); startActivity(intent); 和 Uri uri = Uri.parse("tel:xxxxxx&q