HarmonyOS之UIContext 与 UIAbility、WindowStage 的关系 - 指南
一、ArkUI 核心概念概览
1️⃣ UIAbility:界面能力模块
- 定义:HarmonyOS 中的一个能力组件,具备界面展示能力。
- 作用:是系统调度应用 UI 的“入口单元”,每个 UIAbility 表示一个完整的 UI 业务场景。
- 类比:类似于 Android 中的
Activity
。
export default class MainAbility
extends UIAbility {
onCreate() {
// 能力初始化
}
onWindowStageCreate(windowStage: WindowStage) {
// 创建窗口、加载页面
}
}
2️⃣ WindowStage:窗口阶段管理器
- 定义:表示
UIAbility
生命周期中的一个窗口阶段,类似于“画布容器”。 - 作用:用于加载、卸载 UI 页面,是页面内容的挂载点。
- 使用方法:通常在
onWindowStageCreate()
生命周期中调用setUIContent()
或loadContent()
。
windowStage.setUIContent((context: UIContext) =>
{
return <MainPage />;});
3️⃣ UIContext:页面上下文对象
定义:表示页面组件的运行时上下文环境。
作用:
- 页面导航(push、replace、back)
- 生命周期事件监听(onShow、onHide)
- 获取页面跳转参数
特点:由系统在页面加载时自动创建,注入给页面组件。
context.push('/DetailPage');
// 页面跳转
context.onShow(() =>
{
});
// 页面显示时触发
let params = context.getParams();
// 获取跳转参数
⚠️ UIContext 并不能访问资源、状态或能力对象,它不是 Android 的 Context。
二、三者之间的关系图
我们可以用下面这张图形象展示它们的创建顺序与依赖结构:
[系统调度]
↓
[UIAbility](能力入口)
↓
[WindowStage](窗口载体)
↓
setUIContent(callback: (UIContext) => UIComponent)
↓
[UIContext](运行时上下文)
↓
页面组件运行(MainPage、DetailPage 等)
三、实际代码流程解析
一个完整的流程示例:
// MainAbility.ts
onWindowStageCreate(windowStage: WindowStage) {
windowStage.setUIContent((context: UIContext) =>
{
return <MainPage />;});}
⛓️ 执行链说明:
- 系统启动应用或某个页面的
UIAbility
- 在
onWindowStageCreate()
中初始化窗口 - 调用
setUIContent()
加载 UI 页面 - 系统自动创建
UIContext
并注入页面组件 - 页面在该
UIContext
中运行,处理跳转、生命周期等
四、UIContext 能做什么?不能做什么?
✅ UIContext 的核心能力(来自官方 API)
功能类别 | API 名称 | 示例代码 |
---|---|---|
页面跳转 | push(url) | context.push('/detail') |
页面替换 | replace(url) | context.replace('/login') |
返回上一页 | back() | context.back() |
获取参数 | getParams() | let p = context.getParams() |
生命周期监听 | onShow() / onHide() | context.onShow(() => {...}) |
❌ UIContext 无法完成的操作(常见误区)
想做的事 | 正确方式 |
---|---|
获取字符串/图片资源 | 使用 $r('app.string.xxx') 语法 |
获取能力对象(UIAbility) | 不支持,能力对象不暴露在组件中 |
访问全局状态 / 持久化存储 | 使用 AppStorage 、Storage 模块 |
管理多个窗口或子窗口 | 使用 Window 模块或 Ability 多实例机制 |
五、架构设计理念
为什么要有 UIContext?
ArkUI 是声明式 UI 框架,所有组件都应该是无状态的、可组合的,但在页面开发中我们仍然需要:
- 页面跳转能力(导航)
- 生命周期感知(onShow/onHide)
- 获取跳转参数
所以引入了 UIContext,为页面组件提供必要的运行上下文功能,但不授予系统能力访问权限,实现职责隔离。
⚙️ 模块化分工回顾:
层级 | 组件 | 职责 |
---|---|---|
能力级别 | UIAbility | 表示一个界面能力,负责启动和窗口创建 |
窗口级别 | WindowStage | 表示 UIAbility 中的窗口阶段,挂载 UI |
页面级别 | UIContext | 管理页面组件的运行时上下文与生命周期 |
六、总结一句话
UIAbility 是入口,WindowStage 是容器,UIContext 是组件运行时的大脑。
它们构建出 ArkUI 应用的核心三层结构,实现了解耦、可组合、可维护的鸿蒙 UI 架构。
最后
ArkUI 是 HarmonyOS NEXT 的主推框架,拥有声明式语法、组件化机制、多窗口支持等诸多亮点。
理解 UIContext
与 UIAbility
、WindowStage
的协作机制,是迈向 ArkUI 高阶开发的重要一步。