我们平时在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按键的屏蔽。