1-7.【Stage 模型】Stage 模型下页面跳转的本质是什么?

4 阅读2分钟

Stage 模型下页面跳转的本质是什么?router 的底层是否跨 Ability?页面栈在何处维护?如何实现跨 Ability 跳转?

1️⃣ Stage 模型下页面跳转的本质

HarmonyOS Stage 模型中:

  • 页面跳转本质是 在 WindowStage 内管理页面栈(Page Stack)的入栈/出栈操作

  • 每个页面(Page)是 WindowStage 的栈元素,由 router 负责:

    • push → 页面入栈,显示在栈顶
    • pop → 页面出栈,释放资源
    • replace → 替换栈顶页面

🔹 核心理解:页面跳转 ≈ 页面栈操作,而非重新创建整个 Ability


2️⃣ router 底层是否跨 Ability?

  • router 默认操作的是同一 WindowStage 内的页面栈,也就是说:

    • 普通 push/pop/replace 不跨 Ability
  • 跨 Ability 跳转需要通过 系统 AbilityManager 启动目标 Ability,router 只是封装了路由调用入口。

Ability 内:
router.push("PageB") → WindowStage 栈操作

跨 Abilityrouter.startAbility(Intent(targetAbility)) → 系统启动 Ability → 创建 WindowStage → 页面栈初始化

✅ 底层 router 本身没有直接跨 Ability 的能力,跨 Ability 跳转依赖 系统能力管理 + Stage 模型 WindowStage 实例化


3️⃣ 页面栈在哪里维护?

  • 页面栈 维护在 WindowStage 内

    • 每个 WindowStage 独立维护自己的 Page 栈
    • UIAbility 可以拥有多个 WindowStage,每个窗口的页面栈相互独立
UIAbility
 ├─ WindowStage 1 → Page栈 A[Page1, Page2, Page3]
 └─ WindowStage 2 → Page栈 B[PageX, PageY]
  • router 操作都是对 当前 WindowStage 的栈顶/栈操作

4️⃣ 如何实现跨 Ability 跳转?

跨 Ability 跳转流程:

  1. 创建 Intent / AbilityRequest

    • 指定目标 Ability(可能在 Feature HAP 或 Entry HAP)
    • 可以携带参数、页面初始状态
  2. 调用系统 AbilityManager 启动 Ability

    • 系统检查目标 Ability 是否已加载,如果未加载则动态加载 HAP(Feature 按需加载)
    • 系统创建 UIAbility 实例
  3. 创建 WindowStage

    • 系统在目标 Ability 内为页面创建 WindowStage
    • 初始化页面栈(Page Stack)并显示栈顶页面
  4. 参数与状态传递

    • Intent / ArkTS 全局状态 / DataBus / Service HAP 用于传递数据
    • 可以模拟跨模块状态共享

🔹 核心:跨 Ability 跳转 = AbilityManager 启动 + WindowStage 创建 + 页面栈初始化 + 参数传递


5️⃣ 总结

问题核心答案
页面跳转本质WindowStage 内页面栈的入栈/出栈操作
router 是否跨 Ability不跨,跨 Ability 需要系统 AbilityManager
页面栈维护位置WindowStage 内,每个窗口独立管理
跨 Ability 跳转实现Intent → AbilityManager → UIAbility 实例 → WindowStage → 页面栈 → 参数传递

✅ 核心理解:

  • 同 WindowStage → 页面栈操作
  • 跨 Ability → 系统管理能力 + WindowStage 实例化 + 页面栈初始化