MAUI Blazor学习16-连续按BACK退出APP
MAUI Blazor学习16-连续按BACK退出APP
MAUI Blazor系列目录
- MAUI Blazor学习1-移动客户端Shell布局 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习2-创建移动客户端Razor页面 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习3-绘制ECharts图表 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习4-绘制BootstrapBlazor.Chart图表 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习5-BLE低功耗蓝牙 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习6-扫描二维码 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习7-实现登录跳转页面 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习8-支持多语言 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习9-VS Code开发调试MAUI入门 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习10-BarcodeScanner扫描二维码 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习11-百度地图定位 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习12-文件另存为 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习13-打开文件 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习14-选择目录 - SunnyTrudeau - 博客园 (cnblogs.com)
- MAUI Blazor学习15-采用html2pdf.js生成pdf - SunnyTrudeau - 博客园 (cnblogs.com)
安卓APP一般都是连续按2次BACK键退出,MAUI Blazor可以判断当前导航页面如果为最后一个,就启动退出检测。网上有现成的例程,照抄即可。参考https://blog.csdn.net/sD7O95O/article/details/132632457,《MAUI APP 发布指南(三)vivo篇-CSDN博客.mhtml》
在Platforms\Android\MainActivity.cs重载按键事件。
D:\Software\gitee\mauiblazorapp\MaBlaApp\Platforms\Android\MainActivity.cs
public class MainActivity : MauiAppCompatActivity { private bool isExit = false; public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent? e) { //最后一个页面按BACK才触发 System.Diagnostics.Debug.WriteLine($"调用OnKeyDown, keyCode={keyCode} keyEvent={e}"); if (keyCode == Keycode.Back) { var modelStack = Microsoft.Maui.Controls.Application.Current.MainPage.Navigation.ModalStack; if (modelStack.Count == 0) { if (isExit) { //第2次返回键 Microsoft.Maui.Controls.Application.Current.Quit(); } else { //第一次返回键 isExit = true; Task.Run(async () => { await Task.Delay(2000); isExit = false; }); //用安卓的方法也可以 //new Android.OS.Handler().PostDelayed(() => //{ // isExit = false; //}, 2000); Toast.MakeText(this, "再按一次退出", ToastLength.Long).Show(); return true; } } } return base.OnKeyDown(keyCode, e); } public override bool DispatchKeyEvent(KeyEvent? e) { //每次按BACK都触发 System.Diagnostics.Debug.WriteLine($"调用DispatchKeyEvent, keyEvent={e}"); return base.DispatchKeyEvent(e); } }
测试的时候发现点击BACK回退页面时,触发了2次DispatchKeyEvent,按下和弹起,但是没有触发OnKeyDown,直到退回到最后一页,才会触发OnKeyDown。
【正常回退页面】
[0:] 调用DispatchKeyEvent, keyEvent=KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=95052961, downTime=95052961, deviceId=-1, source=0x101, displayId=0 }
[0:] 调用DispatchKeyEvent, keyEvent=KeyEvent { action=ACTION_UP, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=95053063, downTime=95052961, deviceId=-1, source=0x101, displayId=0 }
【回退到最后一个页面】
[0:] 调用DispatchKeyEvent, keyEvent=KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=95068879, downTime=95068879, deviceId=-1, source=0x101, displayId=0 }
[0:] 调用OnKeyDown, keyCode=Back keyEvent=KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=95068879, downTime=95068879, deviceId=-1, source=0x101, displayId=0 }
[0:] 调用DispatchKeyEvent, keyEvent=KeyEvent { action=ACTION_UP, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=95069038, downTime=95068879, deviceId=-1, source=0x101, displayId=0 }
【回退到最后一个页面,快速2次BACK退出APP】
[0:] 调用DispatchKeyEvent, keyEvent=KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=95094450, downTime=95094450, deviceId=-1, source=0x101, displayId=0 }
[0:] 调用OnKeyDown, keyCode=Back keyEvent=KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=95094450, downTime=95094450, deviceId=-1, source=0x101, displayId=0 }
[0:] 调用DispatchKeyEvent, keyEvent=KeyEvent { action=ACTION_UP, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=95094575, downTime=95094450, deviceId=-1, source=0x101, displayId=0 }
[0:] 调用DispatchKeyEvent, keyEvent=KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=95095075, downTime=95095075, deviceId=-1, source=0x101, displayId=0 }
[0:] 调用OnKeyDown, keyCode=Back keyEvent=KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=95095075, downTime=95095075, deviceId=-1, source=0x101, displayId=0 }
DEMO代码地址:https://gitee.com/woodsun/mauiblazorapp