android4.1 activity内屏蔽HOME按键功能

来源:互联网 发布:非主流伤感的网络歌曲 编辑:程序博客网 时间:2024/05/29 15:14

之前在http://blog.csdn.net/fulinwsuafcie/article/details/7717408看到如何屏蔽home按键。上面讲解的很详细了。在此在表述一下:

1、重写onAttachedToWindow

@Overridepublic 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

@Overridepublic 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的时候还是起作用的。)




原创粉丝点击