1️⃣ 基本概念
| 类型 | 作用 | 特点 |
|---|---|---|
| UIAbility | 承载用户界面和交互逻辑 | 拥有 WindowStage 和页面栈,支持 Stage 模型生命周期 |
| ServiceAbility | 后台能力模块 | 无 UI,独立执行任务,可在前台 UIAbility 调用或跨进程访问 |
✅ 核心:UIAbility 专注 UI,ServiceAbility 专注业务逻辑或后台服务,通过系统桥接协作。
2️⃣ 协作机制
UIAbility 与 ServiceAbility 协作主要有三种方式:
2.1 直接启动 / 调用
-
UIAbility 启动 ServiceAbility:
AbilityManager.startAbility(Intent(targetService)) -
ServiceAbility 执行后台任务
-
UIAbility 可通过 回调 / Data Ability /全局状态 获取执行结果
💡 场景:启动计时器、上传任务、后台音频播放
2.2 绑定(Bind)机制
-
UIAbility 与 ServiceAbility 绑定,通过接口直接调用 ServiceAbility 方法:
- UIAbility 调用
connectAbility(Intent)绑定 ServiceAbility - 系统创建 ServiceAbility 实例(同进程或跨进程)
- UIAbility 通过代理对象调用 ServiceAbility 的方法
- ServiceAbility 可以回调 UIAbility 或通过事件分发更新状态
- UIAbility 调用
💡 优点:
- 实时交互,适合需要返回结果的场景
- 支持多进程(系统通过 IPC 管理方法调用)
2.3 事件 / 数据总线(DataBus / EventBus)
- UIAbility 订阅事件或监听 Data Ability
- ServiceAbility 发布事件或更新数据
- 无需直接绑定,降低耦合
💡 场景:
- 后台下载完成通知 UI更新
- 跨 HAP 或跨进程状态同步
3️⃣ 协作生命周期
| 生命周期维度 | 协作特性 |
|---|---|
| UIAbility | onCreate → onForeground → onBackground → onDestroy |
| ServiceAbility | onCreate → onStart → onCommand → onDestroy |
| 协作关系 | UIAbility 可以在生命周期任何阶段启动或绑定 ServiceAbility;ServiceAbility 生命周期独立,支持多 UIAbility 调用 |
✅ 核心原则:
- UIAbility 生命周期不影响 ServiceAbility
- ServiceAbility 可独立存在或跨进程服务多个 UIAbility
4️⃣ 跨进程与多 HAP 协作
-
同进程:UIAbility 调用 ServiceAbility 方法直接共享内存
-
跨进程:
- 系统通过 IPC(类似 Binder / RPC)管理调用和回调
- 参数和返回结果自动序列化
-
跨 HAP:
- ServiceAbility 可以在 Feature HAP 或 Library HAP 中定义
- UIAbility 通过 AbilityManager + Intent 调用
5️⃣ 工程实践建议
-
UIAbility 轻量化:避免 UI 与业务逻辑耦合
-
ServiceAbility 尽量独立:可以后台执行或复用,跨进程调用
-
回调结果:
- 同进程:可直接方法回调
- 跨进程:通过 AbilityCallback / DataBus / ArkTS 全局状态
-
多 UIAbility 调用同一个 ServiceAbility:
- ServiceAbility 状态设计要考虑多客户端访问
- 推荐幂等和线程安全设计
🔹 总结
-
UIAbility → ServiceAbility = UI 与后台业务解耦 + 生命周期独立
-
协作机制:
- 启动调用(一次性任务)
- 绑定(长连接实时交互)
- 事件 / 数据总线(松耦合异步通信)
-
支持 多进程 + 多 HAP,系统负责 IPC 和跨模块调用
-
工程设计原则:UI轻量,后台独立,可复用,支持跨进程和跨设备