You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    }
}

四、核心通信逻辑说明

  1. 依赖注入桥接:通过MAUI的DependencyService实现跨平台服务的实例获取,Blazor页面依赖抽象接口,原生平台提供具体实现,避免直接耦合。
  2. 事件驱动通信:原生层捕获应用生命周期事件后,通过服务的自定义事件通知Blazor,实现原生到Blazor的状态传递。
  3. 资源清理:页面实现IDisposable接口,确保页面卸载时取消事件订阅、关闭扫描模块,防止内存泄漏。

内容的提问来源于stack exchange,提问作者LMR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:51:29