【鸿蒙实战开发】HarmonyOS事件通信能力解决方案

场景描述

在这里插入图片描述

元能力和事件通知当前提供的通信方式主要有Emitter、EventHub、CommonEvent,线程间通信也可以使用Worker和Taskpool提供的postMessage和sendData向数组线程发送消息。应用间通信可以使用自定义公共事件和IPC&RPC两种方式。本文主要介绍事件通知和元能力提供的通信能力。

能力对比:

​Emitter​​主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。FA与Stage模型都可以使用。

​EventHub​​提供了一种基于发布订阅模式的事件机制,通过订阅和发布自定义事件,实现UIAbility组件/ExtensionAbility组件与UI之间的数据同步。通过context获取,多用于主线程通信。仅Stage模型可用。

​CommonEvent​​为应用程序提供订阅、发布、退订公共事件的能力。可分为系统公共事件和自定义公共事件。系统公共事件指,系统内部定义的公共事件,如应用包安装、设备关机等。自定义公共事件可用于实现跨进程的事件通信能力。

方案描述

场景一:同Ability通信

通过Eventhub订阅事件打开自定义弹窗:
效果图

在这里插入图片描述

方案

弹窗功能依赖UI的执行上下文,不可在UI上下文不明确的地方使用,在一些异步回调或非UI界面中调用该接口,可能会无法跟踪到当前UI的上下文,导致接口执行失败,不能正常打开弹窗。所以当使用Eventhub传递事件时需要使用​​promptAction.openCustomDialog​​保证拿到同一UI上下文,才能正常打开弹窗。

核心代码
private uiAbilityContext = getContext() as common.UIAbilityContext;
  1. 订阅方:创建自定义弹窗中显示的组件内容buildText,使用openCustomDialog打开弹窗,eventHub.on订阅弹窗事件。
aboutToAppear(): void { 
  this.uiAbilityContext.eventHub.on('openDialog', () => { 
  this.openDialog('自定义弹窗'); 
}); 
} 

openDialog(str: string) { 
  let uiContext = this.getUIContext(); 
  let promptAction = uiContext.getPromptAction(); 
  let contentNode = new ComponentContent(uiContext, wrapBuilder(buildText), new Params(str)); 
  promptAction.openCustomDialog(contentNode); 
}
  1. 发送方:使用eventHub.emit触发打开弹窗事件。
this.uiAbilityContext.eventHub.emit('openDialog');
  1. 取消订阅事件。
this.uiAbilityContext.eventHub.off('openDialog');

场景二:跨Ability通信

使用EventHub进行数据通信
效果图

在这里插入图片描述

方案

EventHub使用的核心是要保证订阅方和发送方拿到同一个context,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值