【Android系统onKeyDown监控/拦截/监听/屏蔽返回键、菜单键和Home键】 参考:http://orgcent.com/android-back-menu-home-onkeydown/
在Android系统中用来显示界面的组件(Component)为Activity,也就是说只有重写Activity的onKeyDown方法来监控/拦截/屏蔽系统的返回键(back)、菜单键(Menu)及Home键。
1、拦截/屏蔽返回键、菜单键实现代码
1
2 3 4 5 6 7 8 9 10 11 12 |
@Override
public boolean onKeyDown ( int keyCode, KeyEvent event ) { if (keyCode == KeyEvent. KEYCODE_BACK ) { //监控/拦截/屏蔽返回键 processExit ( ) ; return true ; } else if (keyCode == KeyEvent. KEYCODE_MENU ) { //监控/拦截菜单键 } else if (keyCode == KeyEvent. KEYCODE_HOME ) { //由于Home键为系统键,此处不能捕获,需要重写onAttachedToWindow() } return super. onKeyDown (keyCode, event ) ; } |
1
2 3 4 |
public
void onAttachedToWindow
(
)
{
this. getWindow ( ). setType (WindowManager. LayoutParams. TYPE_KEYGUARD ) ; super. onAttachedToWindow ( ) ; } |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/frameworks
/policies
/base
/phone
/com
/android
/internal
/policy
/impl
/PhoneWindowManager.
java
1000行附近
if (code == 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 false ; } final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK. length ; for ( int i = 0 ; i // don't do anything, but also don't pass it to the app return true ; } } } } |
当然,重写View的onKeyDown也可以实现,但View如果没有获得焦点,那就不能监控/拦截返回键、菜单键和Home键,所有还是重写Activity的onKeyDown方法比较好。