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

之前在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的时候还是起作用的。)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值