之前在http://blog.csdn.net/fulinwsuafcie/article/details/7717408看到如何屏蔽home按键。上面讲解的很详细了。在此在表述一下:
1、重写onAttachedToWindow
@Override
public void onAttachedToWindow() {
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);
super.onAttachedToWindow();
}
android的SDK里写的清楚:Called when the window has been attached to the window manager.
onAttachedToWindow在附加到window manager的时候调用。
我们在此添加标志位:FLAG_HOMEKEY_DISPATCHED,这个会通过windowManager通知framework层。
2、 重写onKeyDown
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KeyEvent.KEYCODE_HOME:
Log.i(TAG,"KEYCODE_HOME");
return true;
}
return super.onKeyDown(keyCode, event);
}
但是我这样做后,按home键仍旧会退出到桌面。一再修改flag也没用。最后看了下源码,
在 PhoneWindowManager.java 的 interceptKeyBeforeDispatching 函数中对home键的处理如下:
if (keyCode == 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 0;
}
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 -1;
}
}
关键代码:
if (attrs != null) {
final int flag = attrs.flags;
if ((flag & WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED) != 0) {
// the window wants to handle the home key, so dispatch it to it.
return 0;
}
}
写在了home的代码下面。于是自然的我把它提到上面。问题解决。
修改后的具体代码如下:
///modified by TYD bravoon 20121228 for FLAG_HOMEKEY_DISPATCHED enable
WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;
if (attrs != null) {
final int flag = attrs.flags;
if ((flag & WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED) != 0) {
// the window wants to handle the home key, so dispatch it to it.
return 0;
}
}
///end
// 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 (keyCode == KeyEvent.KEYCODE_HOME) {
...
}
疑问:为何把这个代码放下面?(4.0的时候还是起作用的。)