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

如何从ViewModel订阅.NET MAUI生命周期事件?

直接在ViewModel中订阅MAUI生命周期事件的方案

你当前通过ConfigureLifecycleEvents处理生命周期的方式是可行的,要在ViewModel中直接订阅这些事件,有两种更简洁的方案,无需依赖信使服务:

方案一:实现MAUI原生的生命周期观察者接口

MAUI提供了IApplicationLifecycleObserver(应用级)和IPageLifecycleObserver(页面级)接口,让你可以直接在ViewModel中实现这些接口,再注册到应用生命周期观察者列表中。

  1. 在ViewModel中实现IApplicationLifecycleObserver接口:
using Microsoft.Maui.LifecycleEvents;
#if ANDROID
using Android.App;
using Android.OS;
#endif

public class MainViewModel : IApplicationLifecycleObserver
{
    // 按需实现你需要的生命周期方法
    public void OnResumed()
    {
        // 处理应用恢复逻辑
    }

    public void OnStopped()
    {
        // 处理应用停止逻辑
    }

#if ANDROID
    // 如果需要Android特定的生命周期细节,可以额外处理(可选)
    public void OnCreate(Activity activity, Bundle bundle)
    {
        // 处理Activity创建逻辑
    }
#endif
}
  1. 在MauiProgram.cs中注册ViewModel,并添加到生命周期观察者:
builder.Services.AddSingleton<MainViewModel>();

var app = builder.Build();

// 获取ViewModel实例并注册为生命周期观察者
var mainViewModel = app.Services.GetRequiredService<MainViewModel>();
Application.Current.AddLifecycleObserver(mainViewModel);

return app;

方案二:封装可注入的生命周期事件服务

如果需要更灵活的事件订阅(比如需要传递Android Activity实例),可以封装一个全局服务,将生命周期事件转发为可订阅的委托事件,ViewModel通过依赖注入获取服务后直接订阅。

  1. 创建生命周期事件服务接口与实现:
#if ANDROID
using Android.App;
using Android.OS;
#endif

public interface ILifecycleEventService
{
    // 定义所需的生命周期事件
    event Action OnAppResumed;
#if ANDROID
    event Action<Activity> OnActivityStart;
    event Action<Activity, Bundle> OnActivityCreated;
#endif

    // 对应的事件触发方法
    void RaiseAppResumed();
#if ANDROID
    void RaiseActivityStart(Activity activity);
    void RaiseActivityCreated(Activity activity, Bundle bundle);
#endif
}

public class LifecycleEventService : ILifecycleEventService
{
    public event Action OnAppResumed;
#if ANDROID
    public event Action<Activity> OnActivityStart;
    public event Action<Activity, Bundle> OnActivityCreated;
#endif

    public void RaiseAppResumed() => OnAppResumed?.Invoke();
#if ANDROID
    public void RaiseActivityStart(Activity activity) => OnActivityStart?.Invoke(activity);
    public void RaiseActivityCreated(Activity activity, Bundle bundle) => OnActivityCreated?.Invoke(activity, bundle);
#endif
}
  1. 在MauiProgram.cs中注册服务,并在生命周期事件中触发服务的事件:
// 注册生命周期事件服务
builder.Services.AddSingleton<ILifecycleEventService, LifecycleEventService>();

builder.ConfigureLifecycleEvents(events =>
{
#if ANDROID
    var lifecycleService = builder.Services.BuildServiceProvider().GetRequiredService<ILifecycleEventService>();
    events.AddAndroid(android => android
        .OnStart(activity => lifecycleService.RaiseActivityStart(activity))
        .OnCreate((activity, bundle) => lifecycleService.RaiseActivityCreated(activity, bundle))
        .OnResume(_ => lifecycleService.RaiseAppResumed())
        // 按需添加其他生命周期事件
        );
#endif
});
  1. 在ViewModel中注入服务并订阅事件:
public class MainViewModel : IDisposable
{
    private readonly ILifecycleEventService _lifecycleService;

    public MainViewModel(ILifecycleEventService lifecycleService)
    {
        _lifecycleService = lifecycleService;
        // 订阅所需事件
        _lifecycleService.OnAppResumed += HandleAppResumed;
#if ANDROID
        _lifecycleService.OnActivityStart += HandleActivityStart;
#endif
    }

    private void HandleAppResumed()
    {
        // 处理应用恢复逻辑
    }

#if ANDROID
    private void HandleActivityStart(Activity activity)
    {
        // 处理Activity启动逻辑
    }
#endif

    // 记得在ViewModel销毁时取消订阅,避免内存泄漏
    public void Dispose()
    {
        _lifecycleService.OnAppResumed -= HandleAppResumed;
#if ANDROID
        _lifecycleService.OnActivityStart -= HandleActivityStart;
#endif
    }
}

注意事项

  • 如果你需要页面级别的生命周期事件(比如OnAppearing、OnDisappearing),可以使用IPageLifecycleObserver接口,逻辑和方案一类似。
  • 方案二中如果ViewModel是Scoped或Transient生命周期,必须实现IDisposable取消订阅,防止内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:05:23