Android 拦截Home键的常用方法

来源:互联网 发布:java split函数 多个 编辑:程序博客网 时间:2024/05/18 03:00

  我们平时在Android开发中,很多时候逻辑是需要屏蔽Home键的,一般情况下分为Activity的屏蔽Home键和非Activity的屏蔽。

  一:Activity屏蔽Home按键的方法

    第一种方法:重写onKeyDown

   

    @Override      public boolean onKeyDown(int keyCode, KeyEvent event) {          if(keyCode == KeyEvent.KEYCODE_HOME){     //屏蔽之后的操作            return true;          }        return super.onKeyDown(keyCode, event);}

  这样写大家会发现其实是不能拦截的,这里屏蔽Home键是捕捉不到的,因为大家的权限一般是User所以是无效的。而其实android处理Home键等系统级按键是有一定的处理的。 

有兴趣的可以看一下源码的分析:\frameworks\policies\base\phone\com\android\internal\policy\impl\PhoneWindowManager.java

  通过源码我们可以看出,屏蔽Home键需要一个参数。也就是需要在onCreate()的方法里面加上这样一句:getWindow().addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_HOMEKEY_DISPATCHED);
   这样的话就能够顺利的把Home按键拦截了。

    第二种方法:监听Home按键的广播

    首先需要在onCreate()里面注册广播:

registerReceiver(mHomeKeyEventReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
  然后监听mHomeKeyEventReceiver这个广播:
private BroadcastReceiver mHomeKeyEventReceiver = new BroadcastReceiver() {String SYSTEM_REASON = "reason";String SYSTEM_HOME_KEY = "homekey";String SYSTEM_HOME_KEY_LONG = "recentapps";@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { // 监听home键String reason = intent.getStringExtra(SYSTEM_REASON);// 表示按了home键,程序到了后台} }};

    这种方法同样也能屏蔽拦截Home按键

  二:Dialog屏蔽Home按键的方法

    屏蔽Dialog的Home按键我们一般会这样处理:

final Dialog dialog = new Dialog(this);  dialog.setContentView(R.layout.mydailog);  dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);  dialog.show();    dialog.setOnKeyListener(new android.content.DialogInterface.OnKeyListener(){      @Override      public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {          switch (keyCode) {              case KeyEvent.KEYCODE_HOME:              //相关操作            return true;          }          return false;      }  });  
但是这样写运行后会报错:

 

10-18 13:27:06.380: ERROR/AndroidRuntime(4684): Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRoot$W@2b046d68 -- permission denied for this window type 
其实,原理是一样的,只需要把dialog.getWindow().setType的位置放在show后面就可以了

    dialog.show();      dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);  

这样就完成了Home按键的屏蔽

0 2
原创粉丝点击