最近正在做一个Android的解锁应用,需要屏蔽系统解锁,并在适当的时候打开系统解锁,在网上search了很多有关系统解锁的资料,学到了很多关于系统解锁方面的知识,同时也发现了很多网友犯下的一个共同的错误。现分享一下:

错误一:

总所周知,要关闭系统自带的锁屏服务需要用到以下代码:

mKeyguard = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
mKeylock = mKeyguard.newKeyguardLock("");
mKeylock.disableKeyguard();

要打开系统锁屏服务需要以下代码:

mKeylock.reenableKeyguard()

网上很多朋友对disableKeyguard()的理解为:将屏幕打开并解锁,只要执行这个方法就会是屏幕变亮并自动解锁!同样reenableKeyguard()的作用是关闭屏幕并上锁!

大错而特错了!

我们来看看google api对这两个方法的解释:

disableKeyguard:Disable the keyguard from showing. If the keyguard is currently showing, hide it. The keyguard will be prevented from showing again untilreenableKeyguard() is called.

reenableKeyguard:Reenable the keyguard. The keyguard will reappear if the previous call todisableKeyguard() caused it it to be hidden.

所以,disableKeyguard只是关闭系统锁屏服务,调用该方法后并不会立即解锁,而是使之不显示解锁,同样reenableKeyguard是恢复锁屏服务,并不会立即锁屏!

错误二:

下面是通过两个按钮来模拟打开/关闭系统锁屏的代码:
      
package com.example.keyguard;import android.os.Bundle;import android.app.Activity;import android.app.KeyguardManager;import android.app.KeyguardManager.KeyguardLock;import android.content.Context;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Button;import android.support.v4.app.NavUtils;public class KeyGuardActivity extends Activity {private Button myButtonOn, myButtonOff;private KeyguardManager km;private final String TAG = "KeyGuardTest";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_key_guard);                /* 获取KeyGuardManager对象 */        km = (KeyguardManager)this.getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE);                     myButtonOff = (Button)findViewById(R.id.buttonOff);        myButtonOff.setOnClickListener(new Button.OnClickListener(){public void onClick(View arg0) {/* 关闭系统锁屏服务 */                km.newKeyguardLock(TAG).disableKeyguard();   } });         myButtonOn = (Button)findViewById(R.id.buttonOn);         myButtonOn.setOnClickListener(new Button.OnClickListener(){public void onClick(View arg0) {        /* 打开系统锁屏服务 */km.newKeyguardLock(TAG).reenableKeyguard();           }         });     }  }

这段代码看起来很完美,但是执行之后会发现:只能关闭锁屏服务,无法恢复锁屏服务!
是什么原因呢?
原来是在调用disableKeyguard和reenableKeyguard的时候必须使用同一个KeyguardLock对象!
程序略加修改:
package com.example.keyguard;import android.os.Bundle;import android.app.Activity;import android.app.KeyguardManager;import android.app.KeyguardManager.KeyguardLock;import android.content.Context;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Button;import android.support.v4.app.NavUtils;/** * @author Onejune * @function 打开/关闭系统锁屏服务测试 * @note 在打开/关闭系统锁屏服务时必须使用同一个KeyguardLock对象,否则出错 */public class KeyGuardActivity extends Activity {private Button myButtonOn, myButtonOff;private KeyguardManager km;private KeyguardLock kl;private final String TAG = "KeyGuardTest";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_key_guard);                /* 获取KeyGuardManager对象 */        km = (KeyguardManager)this.getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE);             /* 获取KeyguardLock对象 */        kl = km.newKeyguardLock(TAG);                myButtonOff = (Button)findViewById(R.id.buttonOff);        myButtonOff.setOnClickListener(new Button.OnClickListener(){public void onClick(View arg0) {/* 关闭系统锁屏服务 */kl.disableKeyguard();   }        });                myButtonOn = (Button)findViewById(R.id.buttonOn);        myButtonOn.setOnClickListener(new Button.OnClickListener(){public void onClick(View arg0) {/* 打开系统锁屏服务 */kl.reenableKeyguard();   }        });    }}

终于OK!

更多相关文章

  1. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  2. Android(安卓)面试整理(持续更新)
  3. uni-app系统目录文件上传(非只图片和视频)解决方案
  4. [Android]通过剪切板实现Activity之间传递数据
  5. Android8.0.0-r4系统的启动过程
  6. Android(安卓)学习之《第一行代码》第二版 笔记(十八)调用摄像头拍
  7. Android系统应用程序基本概念解读
  8. Android(安卓)进程
  9. android使用系统资源,链接当前主题中的Style

随机推荐

  1. 【Android】SD卡的安全存储问题
  2. Android撬动IT市场的新支点!
  3. Android教程之一:Window下搭建Android开发
  4. Android程序员必看之Android六大优势
  5. Android撬动IT市场的新支点
  6. Android与物联网设备通信-概念入门
  7. 简析Android对Linux内核的改动-(上)
  8. Android将允许纯C/C++开发应用
  9. 最封闭的开源系统:话说 Android(安卓)的八
  10. android本地系统服务详解