屏蔽Home键
- 格式:doc
- 大小:166.50 KB
- 文档页数:6
相信在Android应用上,很多时候逻辑是需要屏蔽Home键的,但这个用户体验是否需要,就看各位的需求了。
一般的方法屏蔽Home键,大家一定看过不少文章了。我总结一下,先说一下一般情况下Activity的屏蔽按键和Home键吧。
屏蔽其他键,重写onKeyDown
Java代码
1.@Override
2.public boolean onKeyDown(int keyCode, KeyEvent event) {
3.Log.i(TAG,"keycode="+keyCode + " isBan="+isBan);
4.switch (keyCode) {
5.case KeyEvent.KEYCODE_BACK:
6.Log.i(TAG,"KEYCODE_BACK");
7.return true;
8.}
9.return super.onKeyDown(keyCode, event);
10.}
大家会发现,这里屏蔽Home键是捕捉不到的,因为大家的权限一般是User所以是无效的。
而其实android处理Home键等系统级按键是有一定的处理的。
引用
看看源码是怎样处理的
\frameworks\policies\base\phone\com\android\internal\policy\impl\Phon eWindowManager.java #1092
Java代码
1.// First we always handle the home key here, so applications
2.// can never break it, although if keyguard is on, we do let
3.// it handle it, because that gives us the correct 5 second
4.// timeout.
5.if (code == KeyEvent.KEYCODE_HOME) {
6.
7.// If a system window has focus, then it doesn't make sense
8.// right now to interact with applications.
youtParams attrs = win != null ? win.getAttrs() :
null;
10.if (attrs != null) {
11.final int type = attrs.type;
12.if (type == youtParams.TYPE_KEYGUARD
13.|| type == youtParams.TYPE_KEYGUARD_DIALOG) {
14.// the "app" is keyguard, so give it the key
15.return false;
16.}
17.final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;
18.for (int i=0; i 19.if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) { 20.// don't do anything, but also don't pass it to the app 21.return true; 22.} 23.} 24.} 通过源码,我们不难发现两个的参数 youtParams.TYPE_KEYGUARD和 youtParams.TYPE_KEYGUARD_DIALOG 借鉴于此,重写onAttachedToWindow,以实现屏蔽Home键 Java代码 1.public void onAttachedToWindow() { 2.this.getWindow().setType(youtParams.TYPE_KEYGUA RD); 3.super.onAttachedToWindow(); 4.} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 华丽的分界线,以下内容更精彩- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 轮到dialog了,如果在Activity弹出dialog,在Activity设置以上2个方法是没办法屏蔽的。 其实,原理是一样的,只是地方不一样而已。 Java代码 1.final Dialog dialog = new Dialog(this); 2.dialog.setContentView(yout.mydailog); 3.dialog.getWindow().setType(youtParams.TYPE_KEYG UARD); 4.dialog.show(); 5. 6.dialog.setOnKeyListener(new android.content.DialogInterface.OnKeyListener(){ 7.@Override