Android 8.1.0系统如何检测物理菜单按钮按下事件
Android 8.1 物理菜单按键拦截方案
Android 8.1调整了系统按键的派发优先级,你之前尝试的方法不生效属于正常情况:onCreateOptionsMenu用于原生选项菜单创建、onClick只响应触摸点击事件,二者本身就不适用物理按键拦截场景;onKeyDown没有生效大概率是事件被上层控件提前消费了,按以下方案处理即可:
最优方案:重写Activity的dispatchKeyEvent方法
该方法是Activity收到按键事件的第一入口,优先级高于onKeyDown,不会被普通子控件拦截,直接返回true即可消费事件,阻止后续退出逻辑触发:
@Override public boolean dispatchKeyEvent(KeyEvent event) { // 匹配物理菜单按键 if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) { // 处理按下事件 if (event.getAction() == KeyEvent.ACTION_DOWN) { // 此处添加你的自定义业务逻辑 } // 消费事件,阻止系统继续派发 return true; } // 其他按键走默认逻辑 return super.dispatchKeyEvent(event); }
注意事项
- 必须在宿主Activity中重写该方法,Fragment内重写无法收到系统按键事件
- 如果应用内有悬浮窗、弹窗类组件,需要确认此类组件没有提前消费菜单按键事件,弹窗的按键回调优先级高于Activity
- 部分定制ROM的导航栏虚拟菜单键会单独走逻辑,若上述代码不生效,可以同步重写
onKeyDown和onKeyUp做双重拦截:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { // 自定义逻辑 return true; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { // 自定义逻辑 return true; } return super.onKeyUp(keyCode, event); }
内容的提问来源于stack exchange,提问作者piruzi
相关产品推荐
相关产品推荐

