1-2.【Stage 模型】什么是 UIAbility?它与传统 Activity 有什么本质区别?

3 阅读4分钟

1️⃣ 什么是 UIAbility?

HarmonyOS Stage 模型中,UIAbility 是用于承载 用户界面(UI)和交互逻辑的能力(Ability)类型。

它的核心特点:

  1. 界面承载单元

    • 相当于一个“页面能力”,负责显示 UI、接收用户输入。
    • 一个 UIAbility 可以包含多个 WindowStage,每个 WindowStage 下可以有多个页面(Page)。
  2. 生命周期管理

    • UIAbility 生命周期由系统管理:onCreateonWindowStageCreateonForegroundonBackgroundonDestroy
    • 支持 多窗口、多实例,页面和窗口的生命周期解耦。
  3. 多设备协同友好

    • UIAbility 可以通过 Ability Continuation 将状态迁移到其他设备。
    • 窗口(WindowStage)状态与业务能力分离,跨设备迁移无需重建整个 Ability。

2️⃣ UIAbility 与传统 Activity 的本质区别

维度传统 Activity(Android/FA 模型)UIAbility(HarmonyOS Stage 模型)差异与优化点
核心角色页面 + 生命周期能力 + 窗口(WindowStage)Activity 是页面级,UIAbility 是能力级,可承载多个窗口和页面。
页面管理Activity 与页面强绑定UIAbility 与 WindowStage 解耦页面销毁不影响 Ability;支持多窗口、多实例。
生命周期Activity 生命周期与单页面绑定Ability 生命周期与 WindowStage 生命周期分离生命周期更灵活,适合多窗口、多屏、跨设备。
多窗口/分屏受限,需要特殊 API原生支持 WindowStage 多实例支持分屏、折叠屏、小窗、跨设备迁移。
跨设备协作需手动序列化状态Ability Continuation + WindowStage 状态迁移可以无缝迁移到其他设备继续操作。
模块化单 Activity 承载单模块多 HAP + 多 WindowStage 可动态加载跨模块跳转更灵活,状态隔离更明确。

总结

  • Activity = 单页面 + 生命周期绑定
  • UIAbility = 页面能力 + WindowStage + 生命周期解耦

UIAbility 更强调 能力复用、状态隔离、多窗口、多设备协同,解决了传统 Activity/FA 模型在复杂场景下的灵活性问题。

一个 UIAbility 可以承载多少个页面?

HarmonyOS Stage 模型中,一个 UIAbility 可以承载多个页面,但具体数量和承载方式取决于 WindowStage 的实例和页面栈管理。我给你详细梳理:


1️⃣ 页面承载机制

  1. UIAbility → WindowStage → Page

    • UIAbility 是能力级单位,一个 UIAbility 可以创建 多个 WindowStage
    • WindowStage 是窗口级单位,每个 WindowStage 可以有自己的 页面栈(Page Stack)。
    • Page 是最小 UI 单元,承载具体内容和布局。
  2. 页面栈(Page Stack)

    • 每个 WindowStage 内可以有多个 Page 组成 栈式结构
    • 栈顶 Page 是当前显示页面,其余 Page 保持在栈中等待显示。
    • 可以通过 router.push / router.pop 控制页面入栈和出栈。

2️⃣ 承载数量的理论限制

  1. 一个 UIAbility 可以承载多少 WindowStage?

    • 理论上不受严格限制,但过多窗口会增加系统内存压力。
    • 实际工程中,通常每个 UIAbility 只创建 1~2 个 WindowStage 用于多窗口或浮层场景。
  2. 每个 WindowStage 内页面数量

    • 理论上页面栈长度无限,但受 内存、UI 线程渲染性能 限制。
    • 实际上,几百个页面同时在栈中存在会消耗大量内存和 CPU,不推荐。

经验实践

  • 每个 UIAbility 1 个 WindowStage + 少量页面栈(2~10) 最常用。
  • 如果需要复杂多窗口、多任务场景,可以创建 多个 UIAbility 实例或多个 WindowStage

3️⃣ 总结

  • 理论承载能力:无限(受 WindowStage 与页面栈限制)

  • 实际承载能力:有限,受 内存 + 渲染性能 + 用户体验 约束

  • 优化原则

    1. 页面尽量按需创建/销毁
    2. 页面栈保持精简
    3. 多窗口场景用 WindowStage 解耦

页面栈管理是在 Ability 级还是 Window 级?

HarmonyOS Stage 模型中,页面栈管理是在 WindowStage(窗口级)而不是 UIAbility(能力级)


1️⃣ 核心关系

UIAbility
   ├── WindowStage 1
   │      ├── Page A (栈顶)
   │      ├── Page B
   │      └── Page C
   └── WindowStage 2
          ├── Page X
          └── Page Y (栈顶)
  • UIAbility:能力级别,承载业务逻辑 + 多个窗口实例。
  • WindowStage:窗口级别,每个 WindowStage 独立管理自己的 页面栈(Page Stack)
  • Page:页面级别,是栈中的元素,显示在屏幕上。

2️⃣ 页面栈在 WindowStage 级管理的好处

  1. 多窗口支持

    • 每个 WindowStage 有独立页面栈,可以同时显示不同内容。
    • 一个 Ability 下可以有多个 WindowStage,每个窗口维护自己的页面历史。
  2. 页面与能力解耦

    • 页面销毁或切换不会影响整个 UIAbility 生命周期。
    • 支持弹窗、分屏、浮层等复杂场景。
  3. 跨设备协同友好

    • 当 Ability 状态迁移到另一设备时,可以单独迁移某个 WindowStage 的页面栈,而不影响其他窗口。

3️⃣ 工程实践

  • router.push / router.pop / router.replace 都是作用在 WindowStage 内的页面栈

  • 多窗口场景下,如果不同 WindowStage 共享同一个 UIAbility,可以同时维护多个独立的页面栈。

  • 页面栈过长会消耗内存和渲染性能,所以建议:

    • 每个 WindowStage 栈保持适当长度(2~10 页)
    • 弹出不必要的页面,或在后台卸载页面资源

结论

  • 页面栈管理是 WindowStage 级,每个窗口独立维护自己的页面历史。
  • UIAbility 只是能力承载单元,不直接管理页面栈。