Android 拦截Home键的常用方法

  我们平时在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";

		@Override
		public 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按键的屏蔽

你可能感兴趣的:(Android)