开发锁屏程序的时候我们要面临的重要问题无疑是如何屏蔽三个按键,Back,Home,Menu

   看似简单的功能,实现起来却并不是那么容易。

 

  【屏蔽Back按键】

  相对来说,屏蔽Back键是比较简单的,只需要在我们的Activity中重写onKeyDown方法,并在其中对Back按键进行拦截即可,代码如下

  

  //屏蔽back
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
return true;
}
return super.onKeyDown(keyCode, event);
}

【屏蔽Menu按键】

 屏蔽Menu按键看似可以用和Back按键一样的处理方法,但是事实上并不是这样,由于在4.0以上的系统中,大多数情况下点击Menu按键会出现Recent app页面。

 所以使用上面的方法并不管用。

 这时候,我们可以采用另外一种方法——检测我们的窗体是否失去焦点,如果失去,就把弹出的窗体给缩回去。这个方法也可以防止下拉状态栏

 代码如下

   //屏蔽menu
@Override
public void onWindowFocusChanged(boolean pHasWindowFocus) {
super.onWindowFocusChanged(pHasWindowFocus);
if (!pHasWindowFocus) {
sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
}
}

【屏蔽Home按键】

接下来我们要面对的是最复杂的部分,屏蔽Home按键,Home按键由于其特殊性,无法被拦截。

但是我们可以参考其他锁屏应用,设置一个自己的主屏幕应用,让每次点击Home按键的时候启动我们自己的主屏幕,再进行判断,是继续停留锁屏界面还是启动系统   的主屏幕页面。

我们的主屏幕界面Activity应该是没有窗体的,这样我们点击Home的时候就不会看到额外的窗体,让用户体验更好。

下面我们用代码来做讲解

public class Home extends Activity {
HomeChoice homeChoice; //HomeChoice为设置和启动主屏幕类
private SharedPreferences sharedPreferences;
private Editor editor;
private boolean isLock;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
homeChoice = new HomeChoice(this);
sharedPreferences = getSharedPreferences("homeChoice", MODE_PRIVATE);
}
@Override
protected void onStart() {
super.onStart();
isLock = sharedPreferences.getBoolean("IsLocked",false);
//判断锁屏Activity是否在前台
if (isLock) {
Intent mIntent = new Intent(this, ScreenLockActivity.class);
startActivity(mIntent);
finish();
}
//不在前台则启动预设的主屏
else {
try {
homeChoice.originalHome();//启动预设主屏
} catch (Exception e) {
homeChoice.chooseBackHome();//还没有预设,让用户预设
}
}
}
}

为了让这个界面在按下Home时被启动,我们需要在AndroidManifest中进行设置,如下

 <activity
android:name=".Home"
android:theme="@android:style/Theme.NoDisplay"//设置主题为不可见
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />//可以作为桌面被识别
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

我们还需要在系统设置里将我们的应用设置为主屏幕

例如,在原生的系统中可以这样设置

在MIUI中可以这样设置

其他应用管理-->默认应用设置-->桌面

通过上面的步骤,我们就可以完成对Home按键的屏蔽了

上面的代码只是为了让大家更好的理解如何屏蔽按键的原理,并不完整,我已经将一个完整的Demo代码上传到了GitHub上面,如果大家有需要可以去下下来试一下。

地址:https://github.com/u3shadow/ScreenLocker

最近由于涉及到了锁屏方面的开发,所以找了很久这方面的资料,但是都不完善,很痛苦。希望这篇文章能帮助到大家。

Android4.0+锁屏程序开发——按键屏蔽篇的更多相关文章

  1. Android4.0+锁屏程序开发——设置锁屏页面篇

    [如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. ...

  2. C# .NET锁屏程序(顺带屏蔽任务管理器)

    原文:C# .NET锁屏程序(顺带屏蔽任务管理器) 第一步:将窗体的FormBorderStyle设置为none,WindowState设为Maximized 占据整个屏幕. 第二步:使用钩子监控全局 ...

  3. android4.0 锁屏实现(转)

    转载请表明出处:http://blog.csdn.net/wdaming1986/article/details/8837023 好了,言归正传,说说锁屏了,其实把锁屏做成apk的形式,会引起很多问题 ...

  4. 定时锁屏程序,Python祝你原理猝死!

    高以翔事件 11月27日在<追我吧>第九期节目的录制过程中,当期参与嘉宾高以翔奔跑时突然减速倒地,节目现场医护人员第一时间展开救治,并紧急将其送往医院.经过两个多小时的全力抢救,医院最终宣 ...

  5. 解决:Android4.3锁屏界面Emergency calls only - China Unicom与EMERGENCY CALL语义重复

    从图片中我们可以看到,这里在语义上有一定的重复,当然这是谷歌的原始设计.这个问题在博客上进行共享从表面上来看着实没有什么太大的意义,不过由于Android4.3在锁屏功能上比起老版本做了很大的改动,而 ...

  6. 解决:Android4.3锁屏界面Emergency calls only - China Unicom与EMERGENCY CALL语义反复

    从图片中我们能够看到,这里在语义上有一定的反复,当然这是谷歌的原始设计.这个问题在博客上进行共享从表面上来看着实没有什么太大的意义,只是因为Android4.3在锁屏功能上比起老版本号做了非常大的修改 ...

  7. 微信小程序开发之入门篇(熟悉开发工具)

    个人的每一篇博文都谈不上有什么技术含量,只是为了帮助不熟悉微信小程序开发的自己及他人提供一下思路.谢谢,下面开始! PS: 因为本人没有小程序的内测资格,所以所有的开发及Demo都是无AppId的,如 ...

  8. android6.0锁屏界面接收新通知处理流程

    灭屏状态下,接收新信息,屏幕会半亮显示通知流程: 1,应用构造notification后,传给NotificationManager,而后进入NotificationManagerService处理. ...

  9. Mac 如果一定要写个锁屏程序的话就这样

    package test; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import ...

随机推荐

  1. 基于用户登陆的struts2中action的分类详解

    在struts2中action的分类有:继承 ActionSupport 实现 Action,模型驱动(ModelDriven)的 Action,多方法的 Action三种方式. 1.继承 Actio ...

  2. PHP防止mysql注入方法

    本文纲要: 1. 初始化你的变量 2. 一定记得要过滤你的变量 [一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /us ...

  3. 旧书重温:0day2【9】第六章 攻击c++的虚函数

    不知不觉,我们学到了0day2的第六章形形色色的内存攻击技术!其中,这张很多东西都是理论的东西,不过!我们还是要想办法还原下发生的现场! 其中部分文章截图 http://user.qzone.qq.c ...

  4. (二)Nginx反向代理与负载均衡的实现

    引言:nginx正向代理与反向代理在上一篇文章中已经谈论过,这里狗尾草主要告诉大家Nginx对前端的小伙伴来说在工作中如何简单的使用. 1.0什么是反向代理 当我们有一个服务器集群,并且服务器集群中的 ...

  5. 怎么用HD Tune检测硬盘坏道

    HD Tune软件不仅小巧而且很易使用,是一款检测电脑硬盘的优良工具.不仅是电脑硬盘,包括移动硬盘在内一样可以检测.那么,如何使用HD Tune呢?如何使用HD Tune检测磁盘坏道呢? 工具/原料 ...

  6. Intent详解以及实例

    Android中统一用Intent来封装程序的“调用意图“.不管程序想启动一个Activity,一个Servicer,还是一个BroadcastReceiver.使用Intent提供了一个统一的编程模 ...

  7. IT售前经验谈

    在IT界,成功的完成一个项目需要销售人员.售前人员.项目实施人员(开发人员).售后服务人员等密切协作.本文从售前技术支持人员的角度,对售前技术支持工作的过程进行了描述,根据作者在售前的经验,提出了各环 ...

  8. laravel 中config的使用

    在laravel的config中添加配置文件(比如:alipay.php)文件内容为return数组的形式 在方法中使用config()函数获取数据 $config = config('alipay. ...

  9. lnmp centos7 memcache服务器端 和 memcache memcached扩展的安装

    在项目开发的时候有用到memcache,自己在本地需要搭建一个memcache环境,用于开发和测试; wget http://www.memcached.org/files/memcached-1.5 ...

  10. (转)Oracle存储过程中的事务

    本文转载自:http://www.cnblogs.com/linjiqin/archive/2011/04/18/2019990.html 1.事务用于确保数据的一致性,由一组相关的DML语句组成,该 ...