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 栈操作
跨 Ability:
router.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 跳转流程:
-
创建 Intent / AbilityRequest
- 指定目标 Ability(可能在 Feature HAP 或 Entry HAP)
- 可以携带参数、页面初始状态
-
调用系统 AbilityManager 启动 Ability
- 系统检查目标 Ability 是否已加载,如果未加载则动态加载 HAP(Feature 按需加载)
- 系统创建 UIAbility 实例
-
创建 WindowStage
- 系统在目标 Ability 内为页面创建 WindowStage
- 初始化页面栈(Page Stack)并显示栈顶页面
-
参数与状态传递
- Intent / ArkTS 全局状态 / DataBus / Service HAP 用于传递数据
- 可以模拟跨模块状态共享
🔹 核心:跨 Ability 跳转 = AbilityManager 启动 + WindowStage 创建 + 页面栈初始化 + 参数传递
5️⃣ 总结
| 问题 | 核心答案 |
|---|---|
| 页面跳转本质 | WindowStage 内页面栈的入栈/出栈操作 |
| router 是否跨 Ability | 不跨,跨 Ability 需要系统 AbilityManager |
| 页面栈维护位置 | WindowStage 内,每个窗口独立管理 |
| 跨 Ability 跳转实现 | Intent → AbilityManager → UIAbility 实例 → WindowStage → 页面栈 → 参数传递 |
✅ 核心理解:
- 同 WindowStage → 页面栈操作
- 跨 Ability → 系统管理能力 + WindowStage 实例化 + 页面栈初始化