Stage 模型如何实现跨 Ability 通信?是否支持回调结果?startAbilityForResult 底层实现逻辑?Ability 是否一定在同一进程?
1️⃣ Stage 模型如何实现跨 Ability 通信?
跨 Ability 通信本质是 能力(Ability)之间的数据/事件交互,HarmonyOS 提供了几种方式:
| 方式 | 说明 | 使用场景 |
|---|---|---|
| Intent / AbilityRequest | 启动 Ability 时携带参数 | 页面跳转或功能启动时传递初始数据 |
| Data Ability / DataBus | 数据共享,支持 CRUD 和监听 | 跨模块、跨 HAP 数据存储和同步 |
| Service HAP | Ability 注册 Service,其他 Ability 通过 AbilityManager 获取接口调用 | 后台任务或功能复用 |
| ArkTS 全局状态(@Provide/@Consume) | 轻量数据共享 | 跨模块状态同步 |
| EventBus / Observer | 发布订阅模式 | 松耦合事件通知 |
✅ 核心:跨 Ability 通信不直接操作页面栈,而是通过系统能力桥接 + 数据共享实现。
2️⃣ 是否支持回调结果?
- 支持,类似 Android 的
startActivityForResult,HarmonyOS 提供startAbilityForResult。 - 特性:
-
Ability A → Ability B
- A 启动 B 并传入参数
- B 执行操作后,通过回调或 setResult 返回数据
-
回调方式:
- Ability A 提供 AbilityCallback 或 Intent Result 回调
- 系统在 B 结束时将结果传回 A
-
注意:
- 回调只保证 Ability 生命周期存在时有效
- 跨设备迁移可能导致回调延迟,需要结合 WindowStage 或全局状态管理
3️⃣ startAbilityForResult 底层实现逻辑
-
创建 AbilityRequest
- 包含目标 Ability 名称、参数、请求码(requestCode)
-
调用系统 AbilityManager
- 系统检查目标 Ability 是否已加载,未加载则动态加载 HAP(Feature 按需加载)
-
启动目标 UIAbility
- 系统创建 UIAbility 实例
- 创建 WindowStage → 页面栈初始化
-
注册回调通道
- AbilityManager 维护请求码与 AbilityCallback 的映射
- 目标 Ability 执行完毕 → 调用
setResult()→ 系统查找映射 → 回调给源 Ability
-
完成回收
- 如果目标 Ability 已完成且回调已触发,WindowStage 可销毁,资源回收
🔹 核心:startAbilityForResult = Ability 启动 + WindowStage + 页面栈初始化 + 回调注册 + 系统桥接
4️⃣ Ability 是否一定在同一进程?
-
不一定:
- 默认情况下,多数 Ability 在同一应用进程中
- 但 HarmonyOS 支持 多进程 Ability(通过 HAP 配置或系统调度)
-
多进程情况:
| 情况 | 特点 |
|---|---|
| 同进程 | Ability 共享内存,回调和状态直接传递 |
| 跨进程 | 系统通过 IPC(Binder / RPC) 传输数据和回调 |
- 跨进程时,回调结果和参数需要序列化/反序列化
✅ 核心理解:Ability 可以在不同进程,系统会透明管理 IPC 和回调逻辑。
5️⃣ 总结
| 问题 | 核心答案 |
|---|---|
| 跨 Ability 通信 | Intent / Data Ability / Service HAP / ArkTS 全局状态 / EventBus |
| 是否支持回调结果 | 支持,通过 startAbilityForResult + AbilityCallback 或 Intent Result |
| startAbilityForResult 底层 | AbilityRequest → AbilityManager → UIAbility → WindowStage → 页面栈 → 回调注册 → 完成回收 |
| Ability 是否一定同进程 | 不一定,可配置多进程,跨进程时系统通过 IPC 管理数据与回调 |
💡 工程实践建议:
- 跨 Ability 回调尽量使用小数据量,避免跨进程序列化成本
- 跨 HAP 或跨设备迁移时,回调和状态建议结合 WindowStage + 全局状态管理
- Feature HAP 按需加载时,回调注册必须在 Ability 创建完成后进行