1-3.【Stage 模型】UIAbility 的完整生命周期是怎样的?

3 阅读2分钟

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 生命周期独立存在?

  1. 多窗口支持

    • 一个 UIAbility 可以创建多个 WindowStage,每个窗口有自己的页面栈。
    • 如果 WindowStage 生命周期绑定 Ability,多个窗口无法独立存在。
  2. 页面与能力解耦

    • 页面销毁不影响 Ability 本身。
    • 允许弹窗、分屏、浮层等复杂 UI 场景。
  3. 多设备协同

    • Ability 状态迁移到另一设备时,可以只迁移某个 WindowStage 的页面栈。
    • 避免整个 Ability 重新创建,提高跨设备体验。

✅ 核心:WindowStage 生命周期独立 = 页面生命周期解耦 + 支持多窗口 + 跨设备迁移。


3️⃣ 什么时候会出现 Ability 不销毁但页面被销毁的情况?

典型场景包括:

场景说明
页面出栈调用 router.pop()router.replace() 时,页面被销毁,但 UIAbility 仍然存在。
分屏或浮窗关闭某个 WindowStage 被关闭或页面栈中的页面被移除,其 Ability 仍可在后台保持实例。
多窗口切换一个 WindowStage 销毁,Ability 仍有其他 WindowStage 存在,不会触发 Ability onDestroy
后台回收页面因内存压力被系统回收,但 Ability 实例仍存在,可能等待下次恢复。

💡 实践建议:

  • 页面销毁时,释放页面特有资源(动画、定时器、监听器)。
  • Ability 销毁时,再释放能力级资源(数据库连接、服务、全局监听)。

总结

  1. UIAbility 生命周期onCreateonWindowStageCreateonForegroundonBackgroundonDestroy
  2. WindowStage 独立:支持多窗口、页面解耦、跨设备迁移
  3. 页面销毁但 Ability 存在:页面出栈、WindowStage 关闭、多窗口切换或后台回收