1-8.【Stage 模型】Stage 模型如何实现跨 Ability 通信?

3 阅读3分钟

Stage 模型如何实现跨 Ability 通信?是否支持回调结果?startAbilityForResult 底层实现逻辑?Ability 是否一定在同一进程?

1️⃣ Stage 模型如何实现跨 Ability 通信?

跨 Ability 通信本质是 能力(Ability)之间的数据/事件交互,HarmonyOS 提供了几种方式:

方式说明使用场景
Intent / AbilityRequest启动 Ability 时携带参数页面跳转或功能启动时传递初始数据
Data Ability / DataBus数据共享,支持 CRUD 和监听跨模块、跨 HAP 数据存储和同步
Service HAPAbility 注册 Service,其他 Ability 通过 AbilityManager 获取接口调用后台任务或功能复用
ArkTS 全局状态(@Provide/@Consume)轻量数据共享跨模块状态同步
EventBus / Observer发布订阅模式松耦合事件通知

✅ 核心:跨 Ability 通信不直接操作页面栈,而是通过系统能力桥接 + 数据共享实现


2️⃣ 是否支持回调结果?

  • 支持,类似 Android 的 startActivityForResult,HarmonyOS 提供 startAbilityForResult
  • 特性:
  1. Ability A → Ability B

    • A 启动 B 并传入参数
    • B 执行操作后,通过回调或 setResult 返回数据
  2. 回调方式

    • Ability A 提供 AbilityCallbackIntent Result 回调
    • 系统在 B 结束时将结果传回 A
  3. 注意

    • 回调只保证 Ability 生命周期存在时有效
    • 跨设备迁移可能导致回调延迟,需要结合 WindowStage 或全局状态管理

3️⃣ startAbilityForResult 底层实现逻辑

  1. 创建 AbilityRequest

    • 包含目标 Ability 名称、参数、请求码(requestCode)
  2. 调用系统 AbilityManager

    • 系统检查目标 Ability 是否已加载,未加载则动态加载 HAP(Feature 按需加载)
  3. 启动目标 UIAbility

    • 系统创建 UIAbility 实例
    • 创建 WindowStage → 页面栈初始化
  4. 注册回调通道

    • AbilityManager 维护请求码与 AbilityCallback 的映射
    • 目标 Ability 执行完毕 → 调用 setResult() → 系统查找映射 → 回调给源 Ability
  5. 完成回收

    • 如果目标 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 管理数据与回调

💡 工程实践建议

  1. 跨 Ability 回调尽量使用小数据量,避免跨进程序列化成本
  2. 跨 HAP 或跨设备迁移时,回调和状态建议结合 WindowStage + 全局状态管理
  3. Feature HAP 按需加载时,回调注册必须在 Ability 创建完成后进行