MAUI Blazor实战 - Android监听返回键

发布时间 2023-04-18 21:54:43作者: sunday866

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可以进行监听和阻止,没有返回键的使用返回手势也同样可以。