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.KeyCodee.Action 来判断返回键按下的场景,然后判断上一个页面是否是Login,如果是就返回false进行阻止,如果UrList没有记录也进行阻止(切换用户会清空UrList),防止用户在切换账号过程后返回到上一个账户的页面。如果没有上述情景,就调用 return base.DispatchKeyEvent(e); 执行默认返回行为。

总结

经过测试有返回键的Andorid可以进行监听和阻止,没有返回键的使用返回手势也同样可以。

posted @   sunday866  阅读(566)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示