关于 maui-app-lifecycle
.NET MAUI 应用生命周期技能,面向需要处理应用状态与生命周期事件的开发者。它说明前后台事件差异、多窗口行为、状态保存时机及处理器性能限制。
主要功能
- 01区分激活、恢复与停止事件
- 02处理 Android 返回键销毁情形
- 03按窗口独立处理生命周期
- 04避免生命周期处理器阻塞
- 05规划状态保存与恢复
- 06说明 iOS 场景生命周期
适用场景
- 01修正首次启动时未执行的初始化逻辑
- 02选择合适时机保存应用状态
- 03为多窗口应用管理独立状态
- 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