MAUI Blazor 实战:Android监听返回键
MAUI Blazor实战 - Android监听返回键
@
前言
我们在MAUI Blazor项目中有时需要监听Android返回键,例如防止多次点击后退出应用、防止退回到特定页面、以及特定页面禁用退回功能等。
一、常规方法无效?
Activity中有两个可以重写的方法
1、直接监听返回健: 在MainActivity类中重写onBackPressed
public override void OnBackPressed() { base.OnBackPressed(); }
2、监听屏幕按键 :在MainActivity类中重写onKeyDown
public override bool OnKeyDown(Keycode keyCode, KeyEvent e) { return base.OnKeyDown(keyCode, e); }
以上方法在Blazor项目中无效,因为webview会优先接管返回按钮的事件,并阻止向上传播到MainActivity中,可以通过不停按返回按钮的方式进行验证,只有当界面卡顿的时候,才可以在MainActivity中监听到OnKeyDown事件的,OnKeyUp事件虽然可以监听到,但是我们无法在OnKeyUp事件对返回行为进行阻止或干预。
二、使用DispatchKeyEvent
当键盘按下时,以此触发dispatchKeyEvent->onUserInteraction->onKeyDown
松开时:dispatchKeyEvent->onUserInteraction->onKeyUp
具体的事件分发机制可参考官方文档
https://developer.android.com/reference/android/app/Activity#dispatchKeyEvent(android.view.KeyEvent)
这里举一个具体例子
public override bool DispatchKeyEvent(KeyEvent e) { if (e.KeyCode == Keycode.Back) { if (e.Action == KeyEventActions.Down) { if (NavigationManagerExtension.UrList.Any()) { var lastUrl = NavigationManagerExtension.UrList.Last(); var lastIndex = NavigationManagerExtension.UrList.Count - 1; if (lastUrl.Contains("Login")) { NavigationManagerExtension.UrList.Clear(); return false; } else { NavigationManagerExtension.UrList.RemoveAt(lastIndex); } } else { return false; } } else if (e.Action == KeyEventActions.Up) { return false; } } return base.DispatchKeyEvent(e); }
我的路由信息记录在NavigationManagerExtension.UrList中,我希望做到
1、用户不要通过返回键退回到Login页面
2、用户切换账号登录的时候不能返回到上一个账户对应的页面
因为KeyDown 和KeyUp都会触发DispatchKeyEvent,所以我们需要在DispatchKeyEvent中通过e.KeyCode和e.Action 来判断返回键按下的场景,然后判断上一个页面是否是Login,如果是就返回false进行阻止,如果UrList没有记录也进行阻止(切换用户会清空UrList),防止用户在切换账号过程后返回到上一个账户的页面。如果没有上述情景,就调用 return base.DispatchKeyEvent(e); 执行默认返回行为。
总结
经过测试有返回键的Andorid可以进行监听和阻止,没有返回键的使用返回手势也同样可以。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期