相信在Android应用上,很多时候逻辑是需要屏蔽Home键的,但这个用户体验是否需要,就看各位的需求了。
    一般的方法屏蔽Home键,大家一定看过不少文章了。我总结一下,先说一下一般情况下Activity的屏蔽按键和Home键吧。
屏蔽其他键,重写onKeyDown

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.i(TAG,"keycode="+keyCode + "   isBan="+isBan);
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
Log.i(TAG,"KEYCODE_BACK");
return true;
}
return super.onKeyDown(keyCode, event);
}

大家会发现,这里屏蔽Home键是捕捉不到的,因为大家的权限一般是User所以是无效的。
而其实android处理Home键等系统级按键是有一定的处理的。

看看源码是怎样处理的 \frameworks\policies\base\phone\com\android\internal\policy\impl\PhoneWindowManager.java #1092

// First we always handle the home key here, so applications
// can never break it, although if keyguard is on, we do let
// it handle it, because that gives us the correct 5 second
// timeout.
if (code == KeyEvent.KEYCODE_HOME) {
// If a system window has focus, then it doesn't make sense
// right now to interact with applications.
WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;
if (attrs != null) {
final int type = attrs.type;
if (type == WindowManager.LayoutParams.TYPE_KEYGUARD
|| type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) {
// the "app" is keyguard, so give it the key
return false;
}
final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;
for (int i=0; i<typeCount; i++) {
if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {
// don't do anything, but also don't pass it to the app
return true;
}
}
}

通过源码,我们不难发现两个的参数 WindowManager.LayoutParams.TYPE_KEYGUARD和
WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG
借鉴于此,重写onAttachedToWindow,以实现屏蔽Home键

public void onAttachedToWindow() {
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}

轮到dialog了,如果在Activity弹出dialog,在Activity设置以上2个方法是没办法屏蔽的。
其实,原理是一样的,只是地方不一样而已。

final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.mydailog);
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
dialog.show();
dialog.setOnKeyListener(new android.content.DialogInterface.OnKeyListener(){
@Override
public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
Log.i(TAG,"KEYCODE_BACK");
return true;
}
return false;
}
});

这样运行后,出错如下:

10-18 13:27:06.380: ERROR/AndroidRuntime(4684): Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRoot$W@2b046d68 -- permission denied for this window type

其实,只需要把dialog.getWindow().setType的位置放在show后面就可以了

dialog.show();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);

这么,就完成了Back键的屏蔽 和Home键盘的屏蔽了!

总结:
1:)在以上用WindowManager.LayoutParams.TYPE_KEYGUARD的地方改用
WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG 效果一样。至于两者的具体差别,得以后再研究研究。

2:)其实,在源码里是这样调用的。

final AlertDialog dialog = new AlertDialog.Builder(mContext)
.setTitle(null)
.setMessage(message)
.setNeutralButton(R.string.ok, null)
.create();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
dialog.show();

但我们如果这样调用就会出现之前的那个error:permission denied for this window type 这就显而易见了吧~~

3:)ProgressDialog 默认屏蔽 Back键,Dialog,AlertDialog则需setOnKeyListener

4:)其实屏蔽Home键,在页面的某个地方,例如一个Button的onClick里,去设置setType就可以了,如:

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
}
});

但前提是重载Activity的onAttachedToWindow(),哪怕只是一个空实现,然后返回父类方法。

@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
}

5:)其实它们,都是常用的~

switch (keyCode) {
case KeyEvent.KEYCODE_HOME:
Log.i(TAG,"KEYCODE_HOME");
return true;
case KeyEvent.KEYCODE_BACK:
Log.i(TAG,"KEYCODE_BACK");
return true;
case KeyEvent.KEYCODE_CALL:
Log.i(TAG,"KEYCODE_CALL");
return true;
case KeyEvent.KEYCODE_SYM:
Log.i(TAG,"KEYCODE_SYM");
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
Log.i(TAG,"KEYCODE_VOLUME_DOWN");
return true;
case KeyEvent.KEYCODE_VOLUME_UP:
Log.i(TAG,"KEYCODE_VOLUME_UP");
return true;
case KeyEvent.KEYCODE_STAR:
Log.i(TAG,"KEYCODE_STAR");
return true;
}

总结1:)的问题,有答案了,时间问题我就简单写写吧:
    从功能上来说,是一样的,区别在样式。
    如果你喜欢用Theme.Dialog去把一个Activity装饰成一个Dialog去显示,你会发现。

Androidmanifest.xml代码  
  1. android:theme="@android:style/Theme.Dialog"

背景是透明的。
如果在

Android代码  
setTheme(android.R.style.Theme_Dialog);

背景则是黑色的。
这是为什么呢?。。。我不知道。
治标不治本的方法来了!若你在Activity重写onAttachedToWindow

Java代码  
public void onAttachedToWindow() {
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
super.onAttachedToWindow();
}

那么出来的效果,就是透明背景的dialog了,当然前提是你需要实现屏蔽Home键。至于其中到底哪一代码导致样式改变呢,那就以后再去看源代码了~

dialog,activity 屏蔽Home键详解相关推荐

  1. Activity的启动模式详解

    Activity的启动模式详解 Activity有四种载入模式:standard(默认), singleTop, singleTask和 singleInstance. (1).standard(默认 ...

  2. (转载)MySQL数据库的主键和外键详解

    主键 主键的定义 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY 约束来 ...

  3. 计算机键盘五大根键,注册表五大根键详解

    <注册表五大根键详解>由会员分享,可在线阅读,更多相关<注册表五大根键详解(2页珍藏版)>请在人人文库网上搜索. 1.HKEY_CLASSES_ROOTHKEY_CURRENT ...

  4. mysql 外键详解_mysql外键详解

    1.1.MySQL中"键"和"索引"的定义相同,所以外键和主键一样也是索引的一种.不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确 ...

  5. oracle外键--详解

    外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有客户号,客户名称 b表中存有每个客户的订单 ...

  6. activity中onResume方法详解

    onResume 比如做一个音乐播放程序,在播放过程中,突然有电话打进来了,这时系统自动调出电话,而你的音乐播放程序置于后台,触发了onPause方法.当你电话结束后,关闭电话,又自动回到音乐播放程序 ...

  7. Activity的Launch mode详解,A B C D的singleTask模式

    本文参考了此文http://hi.baidu.com/amauri3389/blog/item/a54475c2a4b2f040b219a86a.html 另附 android task与back s ...

  8. 安卓Activity的生命周期函数详解

    首先上个官图: http://developer.android.com/reference/android/app/Activity.html 记住核心方法:onStart().onStop() o ...

  9. Activity七大生命周期详解

    首先,流程图来一张: 介绍生命周期之前,先提一下任务的概念: 任务其实就是activity 的栈,换句话说任务就是" 应用程序" . 栈底的是启动整个任务的Activity,栈顶的 ...

最新文章

  1. js操作frame详细解说,window.opener和window.parent的区别
  2. 自定义EventSource(一)EventCounter
  3. java 中时间计算_java中关于时间的计算
  4. 深入理解和应用Float属性
  5. 开源考试系统 - 本地代码调试运行
  6. java 自动化测试报告_Java自动化测试框架-10 - TestNG之测试结果篇
  7. linux用户怎么归纳到组,Linux用户和组命令总结
  8. fastdfs删除过期文件_Spring Boot 系列:使用 Spring Boot 集成 FastDFS
  9. 软件测试学习指南(更新中)
  10. UVA10570 Meeting with Aliens【数学计算】
  11. 【python】获取http响应
  12. 将Excel文件数据导入到SqlServer数据库的三种方案
  13. Atitit 流水线子线程异常处理 1.1. 大概原理是 FutureTask排除异常 FutureTask.get can throw ExecutionException,can catc
  14. 安卓项目连接后台服务器,android云后端服务器
  15. 前端:分享几个前端素材网站
  16. 交叉编译工具arm-linux-gccarm-elf-gcc下载地址全集
  17. js实现实时的时间显示
  18. uniapp 静态图片不显示
  19. 鼠标键盘失灵对策(Windows8.1)
  20. c语言sizeof char,sizeof 你真的弄明白了吗?来看看这个例子

热门文章

  1. 被世人遗忘的AlphaZero:中国象棋界的AlphaGo
  2. socket套接字 通信原理
  3. JAVA面试灵魂108问(三十六)---实战那些事儿2
  4. php 商品图列表,zencart后台商品列表添加商品图像预览
  5. macOS搭建嵌入式开发环境总结
  6. Shell中的<,<<,>,>>介绍
  7. java内存马分析集合
  8. 深度学习实验基础02:实验室服务器使用
  9. 2018驾考宝典面试总结
  10. 华为云服务器使用测试 with 宝塔安装 Z-Blog的一键搭建