您的位置:首页 > 移动开发 > Android开发

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

2013-10-13 08:25 591 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: