Android Studio 如何为单个Activity禁用返回、主页、菜单全部系统按键(适配Android7+)
适配Android 7及以上的单个Activity系统按键禁用方案
以下方案仅作用于目标Activity,离开页面后系统按键功能会自动恢复,兼容Android 7到最新Android 14版本。
1. 禁用返回键
直接重写目标Activity的onBackPressed方法,空实现即可拦截返回事件:
// Java 实现 @Override public void onBackPressed() { // 不需要调用父类方法,空实现即拦截返回键 }
// Kotlin 实现 override fun onBackPressed() { // 空实现拦截返回键 }
2. 禁用HOME键、菜单键
Android 7开始系统限制了直接拦截这两个按键的权限,需要通过悬浮窗配置+事件拦截组合实现:
第一步:添加权限
在AndroidManifest.xml中添加悬浮窗权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
第二步:配置Activity Window属性
在目标Activity的onCreate方法setContentView之前调用如下配置:
// Java 实现 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); WindowManager.LayoutParams layoutParams = window.getAttributes(); layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; layoutParams.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; window.setAttributes(layoutParams); setContentView(R.layout.your_activity_layout); }
第三步:拦截按键事件
重写onKeyDown方法消费HOME、菜单键事件:
// Java 实现 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_HOME: case KeyEvent.KEYCODE_MENU: case KeyEvent.KEYCODE_BACK: // 返回true表示已消费事件,不会传递给系统处理 return true; default: return super.onKeyDown(keyCode, event); } }
3. 页面销毁时恢复配置
在onDestroy方法清除特殊标记,避免影响其他页面功能:
// Java 实现 @Override protected void onDestroy() { super.onDestroy(); Window window = getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); }
注意事项
- 首次进入该Activity前需要通过
Settings.canDrawOverlays(context)判断是否已获取悬浮窗权限,未授权时引导用户开启权限即可。 - 该方案不会影响应用内其他Activity的系统按键功能。
内容的提问来源于stack exchange,提问作者APTEMKA
相关产品推荐
相关产品推荐

