UIAbility 组件概述|我边学边记的版本
这一篇是我学习 HarmonyOS Stage 模型时,对 UIAbility 做的一份“自己能看懂”的整理。 想搞清楚两件事:
- UIAbility 到底是什么?
- 什么时候用一个?什么时候要拆成多个?
1. UIAbility 是什么?
一句话概括:
UIAbility = 带界面的“能力单元”,是系统调度的基本单位,用来承载和用户交互的 UI。
比如:
- 图库应用的图片瀑布流页面;
- 支付应用的首页、收付款界面;
- 聊天应用里的聊天列表、音视频通话窗口……
只要是需要窗口、需要 UI、要和用户交互的那一块逻辑,基本都落在 UIAbility 上。
UIAbility 的设计目标主要有两点:
- ✅ 支持 跨端迁移、多端协同(比如从手机流转到平板继续使用)
- ✅ 支持 多设备形态 + 多窗口(比如 PC/平板上多个窗口并行)
2. UIAbility 应该怎么“划分”?
一个应用可以只用一个 UIAbility,也可以拆成好几个。 官方的建议大概是:
2.1 只用一个 UIAbility + 多个页面(常见模式)
适用场景:
-
你希望在系统的 任务视图 里,只看到这个应用的 一个任务卡片。
-
应用内部有很多页面,但它们都是“同一个任务”的不同状态,比如:
- 首页 → 详情页 → 设置页……
-
不需要在系统层面把它们拆成不同任务。
优点:
- 资源加载更集中,避免多余的 UIAbility 进程/能力管理。
- 整体结构更简单,适合大部分普通应用。
可以理解为: 一个 UIAbility = 一个“任务入口” ,内部再用 ArkUI 页面跳转。
2.2 使用多个 UIAbility(多窗口 / 多任务场景)
如果你有下面这些需求,就考虑拆多个 UIAbility:
-
希望在任务视图中看到多个独立任务;
-
希望在一个屏幕上 分屏显示不同功能窗口;
-
不同能力之间相对独立,比如:
-
即时通讯应用:
- 消息列表:一个 UIAbility;
- 音视频通话:另一个 UIAbility;
-
支付应用:
- 普通入口:一个 UIAbility;
- 收款/付款:单独 UIAbility,方便快捷打开或分屏。
-
这时候好处是:
- 每个 UIAbility 都有自己的一条任务记录;
- 更适合复杂、多窗口、多任务并行的场景。
小插曲:什么是“任务视图”?
文档里提到的 任务视图,就是我们常说的:
- “最近任务 / 多任务界面”
- 可以快速看见当前设备上正在运行的各个任务 / 应用
- 每一个 UIAbility 实例 = 对应一条任务记录
所以你选择 一个 UIAbility 还是多个,直接影响这里呈现的“任务数量”。
3. UIAbility 要怎么在配置里声明?
要让系统知道“我这个模块里有一个 UIAbility”,需要在 module.json5 里进行声明。
核心字段都在 module.module.abilities 数组中:
{
"module": {
// 其他模块配置...
"abilities": [
{
"name": "EntryAbility", // UIAbility 的名字(类名)
"srcEntry": "./ets/entryability/EntryAbility.ets", // 入口 ets 文件路径
"description": "$string:EntryAbility_desc", // 描述信息(字符串资源)
"icon": "$media:app_icon", // 任务视图等地方显示的图标
"label": "$string:EntryAbility_label", // 任务/桌面里显示的名称
"startWindowIcon": "$media:app_icon", // 启动页上的图标
"startWindowBackground": "$color:start_window_bg" // 启动页的背景颜色
// 还可以根据需要继续补充其他配置
}
]
}
}
简单理解每一项的作用:
name:UIAbility 的逻辑名称,代码里用到;srcEntry:对应的 ArkTS 类所在路径;description:系统读取用的描述文案;icon/label:用于显示在系统 UI 中(比如最近任务);startWindowIcon/startWindowBackground:应用启动时那一帧“启动画面”的图标和背景。
4. 我自己的理解小结
如果用一句比较日常的话来记:
- UIAbility 是“能被系统单独调度的那一块 UI 能力” ;
- 内部再交给 ArkUI 去做页面、路由、状态管理;
- 想只看一个任务:一个 UIAbility 搞定;
- 想多个窗口并行 / 分屏:就拆多个 UIAbility。
以后在设计应用结构时,可以先问自己三个问题:
- 用户在任务视图里需要看到几个“独立任务”?
- 有没有需要同时展示多个窗口的场景?
- 这些功能之间是“页面跳转关系”,还是“并列任务关系”?