文章

鸿蒙 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 进行授权