开发锁屏程序的时候我们要面临的重要问题无疑是如何屏蔽三个按键,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. Build ios app with Delphi Xe4. Lazy Social Talker ready for sale.

    Yes, it is build with Delphi XE4. try it. now. What is  Lazy Social  Talker? Lazy Social Talker is a ...

  2. java如何填写简历?(干货篇)

        化身孤岛的鲸不才 - 十三夜之月 一份优秀的简历不一定能帮你找到一份满意的工作,但能大大提升你的面试机会. 不容否认,简历是对你的能力.教育和经历的一份简要信息概述. 简历中应该突出你最核心的 ...

  3. HohoCoder 1184 : 连通性二·边的双连通分量(+原理证明)

    1184 : 连通性二·边的双连通分量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,网络所的老师 ...

  4. 剑指Offer面试题:1.实现单例模式

    一 题目:实现单例模式Singleton 题目:设计一个类,我们只能生产该类的一个实例. 只能生成一个实例的类是实现了Singleton(单例)模式的类型.由于设计模式在面向对象程序设计中起着举足轻重 ...

  5. leetcode_sql_4,196

    196. Delete Duplicate Emails Write a SQL query to delete all duplicate email entries in a table name ...

  6. 重温CLR(二)生成、部署以及程序集

    将类型生成到模块中 class Program { static void Main(string[] args) { Console.WriteLine("Hi"); } } 该 ...

  7. 洛谷 P1262 间谍网络

    传送门 题目大意:A能揭发B,B能揭发C..某些人可以被收买,如果收买A,那么A,B,C..的情报都可以得到. 求能否得到所有情报,如果可以最少花费多少钱去收买. 题解:tajian缩点 dfs/bf ...

  8. python SQLAlchemy自动生成models文件

    1.安装SQLAcodegen pip install sqlacodegen 2.执行 sqlacodegen mysql://root:123456@127.0.0.1:3306/test > ...

  9. YY一下十年后的自己(转)

    每到年底总是我最焦虑的时候,年龄越大情况越明显.可能越长大越是对 时光的流逝 更有感触,有感触之后就会胡思乱想.所以随手开始写下这篇文章. 人无远虑必有近忧.那么同学呀,你听说过安利么. 一直都有做总 ...

  10. merge into报错ORA-00926、ORA-38014

    今天用ibatis写个插入操作,为了兼容修改想使用 merge into语句,以便重复插入时直接 update,具体语句如下: <insert id="wlf"> ME ...