UIAbility 的完整生命周期是怎样的?为什么 WindowStage 生命周期独立存在?什么时候会出现 Ability 不销毁但页面被销毁的情况?
1️⃣ UIAbility 的完整生命周期
在 HarmonyOS Stage 模型中,UIAbility 的生命周期可以分为以下阶段:
| 生命周期阶段 | 回调方法 | 描述 |
|---|---|---|
| 创建 | onCreate() | Ability 实例被创建,进行能力级初始化。 |
| 窗口创建 | onWindowStageCreate() | 窗口(WindowStage)被创建,此时可绑定页面和 UI 控件。 |
| 前台显示 | onForeground() | Ability 进入前台,可与用户交互。 |
| 后台运行 | onBackground() | Ability 被置于后台,可释放非关键资源,但实例仍存在。 |
| 销毁 | onDestroy() | Ability 被系统回收或用户关闭,释放所有资源。 |
💡 补充说明:
- onWindowStageCreate 是 Stage 模型的新概念,用于 WindowStage 生命周期与 Ability 解耦。
- 页面(Page)是在 WindowStage 上管理的,它的生命周期和 UIAbility 生命周期 不完全绑定。
2️⃣ 为什么 WindowStage 生命周期独立存在?
-
多窗口支持
- 一个 UIAbility 可以创建多个 WindowStage,每个窗口有自己的页面栈。
- 如果 WindowStage 生命周期绑定 Ability,多个窗口无法独立存在。
-
页面与能力解耦
- 页面销毁不影响 Ability 本身。
- 允许弹窗、分屏、浮层等复杂 UI 场景。
-
多设备协同
- Ability 状态迁移到另一设备时,可以只迁移某个 WindowStage 的页面栈。
- 避免整个 Ability 重新创建,提高跨设备体验。
✅ 核心:WindowStage 生命周期独立 = 页面生命周期解耦 + 支持多窗口 + 跨设备迁移。
3️⃣ 什么时候会出现 Ability 不销毁但页面被销毁的情况?
典型场景包括:
| 场景 | 说明 |
|---|---|
| 页面出栈 | 调用 router.pop() 或 router.replace() 时,页面被销毁,但 UIAbility 仍然存在。 |
| 分屏或浮窗关闭 | 某个 WindowStage 被关闭或页面栈中的页面被移除,其 Ability 仍可在后台保持实例。 |
| 多窗口切换 | 一个 WindowStage 销毁,Ability 仍有其他 WindowStage 存在,不会触发 Ability onDestroy。 |
| 后台回收 | 页面因内存压力被系统回收,但 Ability 实例仍存在,可能等待下次恢复。 |
💡 实践建议:
- 页面销毁时,释放页面特有资源(动画、定时器、监听器)。
- Ability 销毁时,再释放能力级资源(数据库连接、服务、全局监听)。
✅ 总结
- UIAbility 生命周期:
onCreate→onWindowStageCreate→onForeground↔onBackground→onDestroy - WindowStage 独立:支持多窗口、页面解耦、跨设备迁移
- 页面销毁但 Ability 存在:页面出栈、WindowStage 关闭、多窗口切换或后台回收