dispatchKeyEvent和onKeyDown

1)当我们重写了onKeyDown方法后,如果return false,则会继续调用系统的onKeyDown方法。

如果只想让程序调用自己写的onKeyDown,则需要return true。

利用该特性可以拦截耳机耳机按键,防止启动音乐。


下面转载一下拦截屏幕按键的方法:

在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 ) ;
}

2、拦截/屏蔽系统Home键

1
2
3
4
public  void onAttachedToWindow ( )  {  
      this. getWindow ( ). setType (WindowManager. LayoutParams. TYPE_KEYGUARD ) ;     
      super. onAttachedToWindow ( ) ;    
}
为什么必须重写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 <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  true ;  
             }  
         }  
     } 
}

当然,重写View的onKeyDown也可以实现,但View如果没有获得焦点,那就不能监控/拦截返回键、菜单键和Home键,所有还是重写Activity的onKeyDown方法比较好。


dispatchKeyEvent和onKeyDown

return true

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值