如何从ViewModel订阅.NET MAUI生命周期事件?
直接在ViewModel中订阅MAUI生命周期事件的方案
你当前通过ConfigureLifecycleEvents处理生命周期的方式是可行的,要在ViewModel中直接订阅这些事件,有两种更简洁的方案,无需依赖信使服务:
方案一:实现MAUI原生的生命周期观察者接口
MAUI提供了IApplicationLifecycleObserver(应用级)和IPageLifecycleObserver(页面级)接口,让你可以直接在ViewModel中实现这些接口,再注册到应用生命周期观察者列表中。
- 在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 }
- 在
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通过依赖注入获取服务后直接订阅。
- 创建生命周期事件服务接口与实现:
#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 }
- 在
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 });
- 在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
相关产品推荐
相关产品推荐

