Blazor for MAUI:Blazor UI如何感知页面卸载、应用暂停与恢复
解决方案:MAUI Blazor 与 Android 原生模块通信实现扫描模块生命周期管理
一、定义跨平台共享服务接口
先在共享项目中创建统一接口,规范扫描模块操作及应用状态通知逻辑,实现Blazor与原生代码的解耦:
// 共享项目中 public interface IScannerService { // 扫描模块核心操作 void InitializeScanner(); void ShutdownScanner(); // 原生层触发的应用状态变化事件 event Action OnAppResumed; event Action OnAppPaused; }
二、实现Android平台专属服务
在Android项目中实现上述接口,同时对接应用生命周期方法,通过事件通知Blazor状态变化:
// Android项目内 [assembly: Dependency(typeof(AndroidScannerService))] namespace YourApp.Platforms.Android { public class AndroidScannerService : IScannerService { public event Action OnAppResumed; public event Action OnAppPaused; public void InitializeScanner() { // 调用硬件扫描模块的初始化逻辑,示例: // HardwareScanner.Instance.Init(); } public void ShutdownScanner() { // 调用硬件扫描模块的关闭逻辑,示例: // HardwareScanner.Instance.Shutdown(); } // 供MainActivity调用,传递应用生命周期事件 public void TriggerAppResumed() { OnAppResumed?.Invoke(); } public void TriggerAppPaused() { OnAppPaused?.Invoke(); } } }
修改Android的MainActivity,在生命周期方法中调用服务的状态触发方法:
// Android项目的MainActivity.cs protected override void OnResume() { base.OnResume(); var scannerService = DependencyService.Get<IScannerService>(); scannerService?.TriggerAppResumed(); } protected override void OnPause() { base.OnPause(); var scannerService = DependencyService.Get<IScannerService>(); scannerService?.TriggerAppPaused(); }
三、Blazor页面订阅事件并处理
在Razor页面中注入服务,订阅状态事件,同时处理页面卸载时的资源清理:
@page "/scanner-page" @inject IScannerService ScannerService @implements IDisposable <h3>扫描功能页面</h3> @code { protected override void OnInitialized() { base.OnInitialized(); // 页面加载时初始化扫描模块 ScannerService.InitializeScanner(); // 订阅应用状态变化事件 ScannerService.OnAppResumed += RestartScanner; ScannerService.OnAppPaused += StopScanner; } private void RestartScanner() { // 应用恢复时重新初始化扫描模块 ScannerService.InitializeScanner(); } private void StopScanner() { // 应用暂停时关闭扫描模块 ScannerService.ShutdownScanner(); } public void Dispose() { // 页面卸载时取消订阅并清理资源 ScannerService.OnAppResumed -= RestartScanner; ScannerService.OnAppPaused -= StopScanner; ScannerService.ShutdownScanner(); } }
四、核心通信逻辑说明
- 依赖注入桥接:通过MAUI的
DependencyService实现跨平台服务的实例获取,Blazor页面依赖抽象接口,原生平台提供具体实现,避免直接耦合。 - 事件驱动通信:原生层捕获应用生命周期事件后,通过服务的自定义事件通知Blazor,实现原生到Blazor的状态传递。
- 资源清理:页面实现
IDisposable接口,确保页面卸载时取消事件订阅、关闭扫描模块,防止内存泄漏。
内容的提问来源于stack exchange,提问作者LMR
相关产品推荐
相关产品推荐

