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可以进行监听和阻止,没有返回键的使用返回手势也同样可以。
标签:返回,return,NavigationManagerExtension,监听,DispatchKeyEvent,UrList,MAUI,Blazor,Andr From: https://www.cnblogs.com/sunday866/p/17331304.html