Harmony os——UIAbility 组件概述|我边学边记的版本

80 阅读4分钟

UIAbility 组件概述|我边学边记的版本

这一篇是我学习 HarmonyOS Stage 模型时,对 UIAbility 做的一份“自己能看懂”的整理。 想搞清楚两件事:

  1. UIAbility 到底是什么?
  2. 什么时候用一个?什么时候要拆成多个?

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。

以后在设计应用结构时,可以先问自己三个问题:

  1. 用户在任务视图里需要看到几个“独立任务”?
  2. 有没有需要同时展示多个窗口的场景?
  3. 这些功能之间是“页面跳转关系”,还是“并列任务关系”?