在APK里 截获 系统按键 并处理

来源:互联网 发布:xampp怎么配置mysql 编辑:程序博客网 时间:2024/06/09 19:58

一、前沿

    我们在做应用程序的时候,可能有这样的需求:音量加减按键用做翻页功能,而不调节音量。或者菜单键不用于显示菜单,而用于弹出一个对话框。

这些需求就需要我们在应用里自定义这些按键的处理,而不让系统去处理。这里就记录如何实现这样的需求。

    截获系统按键的实现方式分为两种,一种是普通系统按键(如 back 、menu),一种是特殊系统按键(如 home),下面分别说明。

 

二、普通系统按键的截获方式

以处理 back 键为例,

在Activity里重载 public boolean dispatchKeyEvent(KeyEvent event) 方法,判断键值,如果是KeyEvent.KEYCODE_BACK则返回 true,代码如下:

@Override
    public boolean dispatchKeyEvent(KeyEvent event) { 

      int key = event.getKeyCode();
      int keyaction = event.getAction();

      //Log.i(TAG, "[test] dispatchKeyEvent  event = " + event); 

      if (key == KeyEvent.KEYCODE_BACK ) {
          Log.i(TAG, " catch BACK event!! keyaction: "+keyaction); 

          if(keyaction==0){

              //处理 back键按下

 

          }

         if(keyaction==1){

              //处理 back 键弹起

 

          }


          return true; 
      }  
      
      return super.dispatchKeyEvent(event); 

  }

 

 

三、特殊系统按键的截获方式

以home键为例,实现步骤如下:

1.在AndroidManifest.xml 里添加权限

     <uses-permission android:name="android.permission.DISABLE_KEYGUARD"></uses-permission>

2.在Activity里重载 public void onAttachedToWindow() ,设置参数让系统不处理home键,代码如下:

@Override 
    public void onAttachedToWindow() 
    { 
      // TODO Auto-generated method stub 
      this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);    
      super.onAttachedToWindow(); 
    }

3.自定义按键处理,重载onKeyDown 、onKeyUp 方法,例如处理弹起动作:

public boolean onKeyUp(int keyCode, KeyEvent event) 
    { 
         switch(keyCode) 
         {  
                case KeyEvent.KEYCODE_HOME: 

                    //处理home键弹起
                    Log.d(TAG,"HOME key up test!"); 
                break;
         } 
         return super.onKeyUp(keyCode, event); 
    }

原创粉丝点击