Android(安卓)拦截Home键的常用方法
16lz
2021-01-26
我们平时在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按键的屏蔽。
更多相关文章
- Android(安卓)中监听WIFI连接状态变化
- 隐藏底部导航栏的虚拟按键,并响应点击事件。解决:点击的时候会唤起
- Android利用手势完成屏幕密码锁功能
- Android之监听View的两个指头是放大和缩小
- android:onClick="xxx"
- [Flutter]监听Android返回键事件
- SwipeRefreshLayout Android(安卓)自带的下拉刷新布局
- Android常见的按钮监听器实现方式
- android 如何隐藏4.0以上系统下面的3按个虚拟按键?