Android4.0以后屏蔽以及HOME按键事件拦截

Android4.0以前如果想要拦截或者处理物理HOME按键,可以通过重写onKeyDown函数进行拦截,代码如下:

 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        case KeyEvent.KEYCODE_BACK:
           //返回按键拦截
            return true;
        case KeyEvent.KEYCODE_HOME:
           //Home按键拦截
            return true;

        }
        return super.onKeyDown(keyCode, event);
    }

return true标示不需要底层再处理该事件,应用处理结束后,不会向下传递该事件。如果想做其他的操作,例如点击Home按键或者返回按键,弹出相应提示,可以在上述两个函数当中进行实现。

Android4.0以后,重写该函数,是不能监听到信息的,即使我们重写了上述onKeyDown函数,点击物理HOME按键,是不会响应case KeyEvent.KEYCODE_HOME:原因是Android4.0以后,将HOME按键默认返回到桌面。其他按键重写onKeyDown还是可以完成的。

有些时候,我们需要拦截或者处理HOME按键,其实Android4.0以后也是可以处理的,如果Android4.0以后真的是完全禁止了HOME按键的话,那个人认为 case KeyEvent.KEYCODE_HOME:这个他应该也处理掉才对。同时参考电话应用,来电话的时候,点击HOME按键是没有作用的,原理很简单,电话应用禁止了HOME按键。

实现方式如下:

    private void enableHomeKeyDispatched(boolean enable) {
        final Window window = getWindow();
        final WindowManager.LayoutParams lp = window.getAttributes();
        if (enable) {
            lp.flags |= WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED;
        } else {
            lp.flags &= ~WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED;
        }
        window.setAttributes(lp);
    }

如果只是想简单的禁止HOME按键,也就是在你的应用中,点击HOME按键,你的应用不会被挂到后台,那么在onCreate函数里面直接调用enableHomeKeyDispatched传递false即可,如果想响应home按键,传递false的同时,再重写onKeyDown函数,在KeyEvent.KEYCODE_HOME:里面进行你的操作即可。

完整代码如下:

public class TestHomeActivity extends Activity {
    private TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView)this.findViewById(R.id.textview);
        enableHomeKeyDispatched(false);
    }

    private void enableHomeKeyDispatched(boolean enable) {
        final Window window = getWindow();
        final WindowManager.LayoutParams lp = window.getAttributes();
        if (enable) {
             lp.flags |= WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED;
        } else {
             lp.flags &= ~WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED;
        }
        window.setAttributes(lp);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_HOME;
        textView.setText("key home");
        return true;//return false;
        case KeyEvent.KEYCODE_BACK:
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }


原创文章,转载请填写文章来源:http://blog.csdn.net/songshizhuyuan/article/details/12675679

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值