mcpField
M
maui-app-lifecycle

maui-app-lifecycle

github.com/davidortinau开发17656 次安装17 周前更新
代码仓库

关于 maui-app-lifecycle

.NET MAUI 应用生命周期技能,面向需要处理应用状态与生命周期事件的开发者。它说明前后台事件差异、多窗口行为、状态保存时机及处理器性能限制。

主要功能

  1. 01区分激活、恢复与停止事件
  2. 02处理 Android 返回键销毁情形
  3. 03按窗口独立处理生命周期
  4. 04避免生命周期处理器阻塞
  5. 05规划状态保存与恢复
  6. 06说明 iOS 场景生命周期

适用场景

  1. 01修正首次启动时未执行的初始化逻辑
  2. 02选择合适时机保存应用状态
  3. 03为多窗口应用管理独立状态
  4. 04降低生命周期处理器导致的应用终止风险

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/davidortinau/maui-skills --skill maui-app-lifecycle

安装后在 Claude Code 中输入/maui-app-lifecycle确认已加载。

附带文件references/lifecycle-api.md

详细介绍

.NET MAUI 应用生命周期

关键行为注意事项

⚠️ Resumed ≠ 首次启动

只有从 Stopped 状态返回时才会触发 Resumed。首次启动时,事件顺序为 Created → Activated,不会调用 Resumed。

// ❌ Putting initialization logic in OnResumed — won't run on first launch
protected override void OnResumed()
{
    LoadUserProfile();  // Skipped on cold start!
}

// ✅ Use OnActivated for logic that must run on every foreground entry
protected override void OnActivated()
{
    LoadUserProfile();  // Runs on both first launch and resume
}
⚠️ Deactivated ≠ Stopped

弹出对话框、进入分屏或下拉通知栏都会触发 Deactivated,而不会触发 Stopped。不要在 Deactivated 时保存大量状态——应用可能根本不会进入后台。

// ❌ Heavy save on every deactivation — fires too often
protected override void OnDeactivated()
{
    await SaveAllDataToDatabase();  // Wasteful for a dialog appearance
}

// ✅ Save state only when truly backgrounded
protected override void OnStopped()
{
    await SaveAllDataToDatabase();
}
⚠️ Android 返回按钮会跳过 Stopped

在 Android 上,如果 Activity 结束,按下硬件返回按钮可能会调用 Destroying,而不会调用 Stopped。如果只在 OnStopped 中执行关键保存逻辑,可能会遗漏。

// ✅ Save in both Stopped and Destroying for safety on Android
protected override void OnStopped()
{
    base.OnStopped();
    SaveDraft();
}

protected override void OnDestroying()
{
    base.OnDestroying();
    SaveDraft();  // Catches Android back-button finish
}
⚠️ 多个窗口会独立触发事件

在 iPad、Mac Catalyst 和 Windows 桌面端,每个 Window 实例都会独立触发生命周期事件。不要假设只有一个全局生命周期。

性能:保持处理程序快速完成

生命周期处理程序中的长时间运行任务会导致 Android 因 ANR 被终止(超时为 5s),以及 iOS 因看门狗而被终止(后台时间有限)。

// ❌ Blocking the lifecycle handler
protected override void OnStopped()
{
    Thread.Sleep(3000);  // ANR on Android!
    SaveData();
}

// ✅ Fire-and-forget or use a brief async save
protected override void OnStopped()
{
    base.OnStopped();
    Preferences.Set("draft_text", _viewModel.DraftText);  // Fast, synchronous
}

对于较大的状态,请使用 SecureStorage 或基于文件的序列化,但耗时应控制在 1–2 秒以内。

iOS 场景生命周期

iOS 13+ 使用场景生命周期(SceneWillConnect 等)。MAUI 仍会转发较旧的委托方法,但现代 iOS 应面向基于场景的 API。

状态保留检查清单

  • 在 OnStopped 中保存临时 UI 状态(滚动位置、草稿文本)
  • 在 OnResumed 中恢复状态,而不是在 OnActivated 中恢复(避免重复恢复)
  • 不要在 OnDeactivated 中执行大量 I/O——它触发得太频繁
  • Android:也要在 OnDestroying 中执行关键保存逻辑(处理返回按钮场景)
  • 生命周期处理程序在 2 秒以内完成
  • 多窗口应用应独立处理各个窗口的状态

评论

支持 Markdown