鸿蒙 Ability 组件模型深度解析
鸿蒙 Ability 模型:Stage 模型下的 UIAbility、Ability 生命周期与窗口管理。 讲清组件模型演进,掌握后能答出「Stage 模型相比 FA 模型强在哪」。
鸿蒙 Ability 组件模型深度解析
一句话概括
Ability 是鸿蒙应用的原子单元,从 FA 模型(一页一 Ability)演进到 Stage 模型(一 Ability 管多页 + Extension 承载后台能力),核心是”能力分离”——UI 渲染归 UIAbility,后台任务归 Extension。
核心知识点
1. FA → Stage 的架构变迁
1
2
3
4
5
6
7
8
9
10
11
12
13
FA 模型(旧,HMOS 2-3):
每个页面 = 一个 PageAbility(独立进程)
问题:冷启动慢、页面通信复杂、资源浪费
Stage 模型(新,HMOS 4+):
UIAbility(一组页面的容器)
├── PageA
├── PageB ← 进程内跳转,秒开
└── PageC
ExtensionAbility(按需的独立能力单元)
├── FormExtension(桌面卡片)
├── ServiceExtension(后台任务)
└── ...
2. UIAbility 的生命周期
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
export default class MainAbility extends UIAbility {
// ① 创建(只一次)——初始化全局资源
onCreate(want, launchParam) {
console.log('Ability onCreate');
}
// ② 窗口创建——加载页面
onWindowStageCreate(windowStage) {
windowStage.loadContent('pages/Index', (err) => {});
}
// ③ Ability 切到前台
onForeground() { this.resumeWork(); }
// ④ Ability 切到后台
onBackground() { this.pauseWork(); }
// ⑤ 窗口销毁
onWindowStageDestroy() {}
// ⑥ Ability 销毁(只一次)——清理
onDestroy() {}
}
3. Want——Ability 间通信的”快递单”
1
2
3
4
5
6
7
8
9
10
11
12
// Want 是鸿蒙中组件间跳转和数据传递的核心对象
let wantInfo: Want = {
deviceId: '', // 空 = 本设备
bundleName: 'com.example.app',
abilityName: 'DetailAbility',
parameters: {
id: 123,
title: '文章标题'
}
};
this.context.startAbility(wantInfo); // 跳转到目标 Ability
// 目标 Ability 的 onCreate(want) 中读取 want.parameters
4. ExtensionAbility——能力分离
| Extension 类型 | 作用 | 典型场景 |
|---|---|---|
| FormExtension | 桌面卡片生命周期管理 | 天气、步数、快捷操作 |
| ServiceExtension | 后台任务(有界面不可见) | 音乐播放、文件下载 |
| InputMethodExtension | 输入法扩展 | 第三方输入法 |
| StaticSubscriberExtension | 系统广播接收 | 开机自启、网络变化 |
5. Stage 模型的关键设计
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 一个 Module 的结构
{
"module": {
"name": "entry",
"type": "entry", // entry(主模块)| feature(特性模块)
"abilities": [{
"name": "MainAbility",
"srcEntry": "./ets/MainAbility/MainAbility.ts",
"exported": true, // 是否允许其他应用调用
"skills": [{ // 支持哪些 Want action
"actions": ["action.system.home"],
"entities": ["entity.system.home"]
}]
}]
}
}
其实你每天都在用
- 应用启动:点击桌面图标 → 系统通过 Want 启动 UIAbility → onCreate → 加载首页
- 页面跳转:router.pushUrl() → 同一个 UIAbility 内的页面切换,无进程开销
- 卡片刷新:桌面天气卡片每 30 分钟 → FormExtension.onUpdateForm() → 数据更新
- 分享到微信:应用构造 Want(uri=图片地址, action=SHARE) → 系统拉起目标 Ability
- 后台音乐:网易云退出后 → ServiceExtension 继续播放 → 通知栏显示控制
常见误解(FAQ)
❌ 误区:「Stage 模型下每个页面还是一个 Ability」 Stage 模型的核心改变就是打破了”一页一 Ability”。一个 UIAbility 托管多页面,页面切换是进程内操作(类似 Android 的单 Activity 多 Fragment)。
❌ 误区:「ExtensionAbility 可以常驻后台」 系统对 ExtensionAbility 有严格的生命周期限制。ServiceExtension 在任务结束后(如音乐播放停止)会被系统回收。想常驻后台需要在通知栏显示不可取消的通知。
❌ 误区:「FA 模型已经完全被废弃」 HarmonyOS NEXT (5.0) 确实只支持 Stage 模型。但仍在 HMOS 4.x 设备上有 FA 兼容。面试回答要说清楚”推荐 Stage”。
❌ 误区:「Want 传大对象没问题」 Want.parameters 有大小限制(通常 < 200KB),大数据应该用文件系统或数据库,Want 只传标识符(id/uri)。
一句话总结
Ability 从”页面”到”能力容器”的升级,反映了鸿蒙从移动 OS 向全场景 OS 的底层设计转变——能力可拆分、可组合、可跨设备。
本文由作者按照 CC BY 4.0 进行授权