HarmonyOS事件通信能力解决方案
通信场景 | 能力支持 |
同Ability通信 | Emitter、EventHub、CommonEvent |
跨Ability通信 | Emitter、EventHub、CommonEvent |
跨线程通信 | Emitter、CommonEvent、Worker、Taskpool |
跨进程通信 | CommonEvent、IPC&RPC |
元能力和事件通知当前提供的通信方式主要有Emitter、EventHub、CommonEvent,线程间通信也可以使用Worker和Taskpool提供的postMessage和sendData向数组线程发送消息。应用间通信可以使用自定义公共事件和IPC&RPC两种方式。本文主要介绍事件通知和元能力提供的通信能力。
能力对比:
Emitter主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。FA与Stage模型都可以使用。
EventHub提供了一种基于发布订阅模式的事件机制,通过订阅和发布自定义事件,实现UIAbility组件/ExtensionAbility组件与UI之间的数据同步。通过context获取,多用于主线程通信。仅Stage模型可用。
CommonEvent为应用程序提供订阅、发布、退订公共事件的能力。可分为系统公共事件和自定义公共事件。系统公共事件指,系统内部定义的公共事件,如应用包安装、设备关机等。自定义公共事件可用于实现跨进程的事件通信能力。
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
HarmonyOS代码封装解决方案
650浏览 • 1回复 待解决
高级图表实现解决方案
657浏览 • 1回复 待解决
确认网络状况解决方案
581浏览 • 1回复 待解决
HarmonyOS有访问相册有解决方案
351浏览 • 1回复 待解决
HarmonyOS C++模块引用解决方案
454浏览 • 1回复 待解决
抓包应用,求解决方案
1971浏览 • 1回复 待解决
HarmonyOS 音视频处理相关解决方案
445浏览 • 1回复 待解决
lazyforeach替换数据源解决方案
698浏览 • 1回复 待解决
支持图文混排组件及解决方案
264浏览 • 1回复 待解决
开发疑难问题如下,求解决方案?
225浏览 • 1回复 待解决
图片存储解决方案谁知道啊?
2559浏览 • 1回复 待解决
应用包体积大小优化解决方案
509浏览 • 1回复 待解决
webview中跨域问题解决方案
2590浏览 • 1回复 待解决
包大小优化,有没有好的解决方案?
201浏览 • 2回复 待解决
图像处理库是否有替代的解决方案
362浏览 • 0回复 待解决
List滚动条时长时短,求解决方案?
946浏览 • 1回复 待解决
Harmony API9之后 GIS 解决方案有哪些?
2168浏览 • 1回复 待解决
HarmonyOS list组件包含tab组件上下滑动冲突解决方案
248浏览 • 1回复 待解决
请问我要如何发布我的HarmonyOS组件或解决方案?
5914浏览 • 1回复 已解决
HarmonyOS将两张图片合成一张的解决方案
477浏览 • 1回复 待解决
背景色透明度问题解决方案
538浏览 • 1回复 待解决
List滚动到底部提示,是否有好的解决方案?
943浏览 • 1回复 待解决
HarmonyOS应用是否需要加固,需要的话是否已有解决方案
358浏览 • 1回复 待解决
调试运行的时候报错,有好的解决方案吗?
894浏览 • 0回复 待解决
基于动态配置签名的多人协同开发应用签名解决方案
989浏览 • 1回复 待解决
场景一:同Ability通信
通过Eventhub订阅事件打开自定义弹窗:
效果图
方案
弹窗功能依赖UI的执行上下文,不可在UI上下文不明确的地方使用,在一些异步回调或非UI界面中调用该接口,可能会无法跟踪到当前UI的上下文,导致接口执行失败,不能正常打开弹窗。所以当使用Eventhub传递事件时需要使用promptAction.openCustomDialog保证拿到同一UI上下文,才能正常打开弹窗。
核心代码
1. 订阅方:创建自定义弹窗中显示的组件内容buildText,使用openCustomDialog打开弹窗,eventHub.on订阅弹窗事件。
1. 发送方:使用eventHub.emit触发打开弹窗事件。
2. 取消订阅事件。
场景二:跨Ability通信
使用EventHub进行数据通信
效果图
方案
EventHub使用的核心是要保证订阅方和发送方拿到同一个context,跨ability时可以通过applicationContext传递消息。Emitter不支持传递带有@标签的类(emitter支持的消息类型与worker相同,参考序列化支持类型),可以使用EventHub作为替代方案。
核心代码
1. 订阅方:eventHub.on订阅消息,当收到消息时打开弹窗。
2. 发送方,eventHub.emit传递数据。
3. 取消订阅。
场景三:线程间通信
worker线程执行字符串倒序
效果图
方案
1. 在对应目录下鼠标右键 > New > Worker,新建Worker线程目录及文件,或新建worker.ets文件手动在build-profile.json5添加如下配置。
2. 通过postMessage向worker线程传递字符串,worker线程将字符串倒序后,主线程再通过onmessage接收倒序后的字符串。
核心代码
taskpool实现字符串排序
效果图
方案
1. 使用emitter.on监听事件,当触发事件后,弹出弹窗并将收到的数据eventData显示在弹窗上。
2. 调用sort()对输入字符串数组排序,排序完成后通过emitter.emit将排序后的数据传递。
3. taskpool.Task构造排序任务Task,然后使用taskpool.execute执行创建好的任务,执行完成后将排序后的字符串同步到输出框。
核心代码
订阅事件,收到事件后弹出弹窗。
启动任务池taskpool执行任务。
字符串排序并触发事件。
场景四:进程间通信
CommonEvent自定义公共事件
效果图
方案
1. 发布方定义CommonEventPublishData,设置订阅者包名,通过commonEventManager.publish发布自定义公共事件。
2. 订阅方使用createSubscriber创建订阅者,并设置订阅者信息CommonEventSubscribeInfo,当收到公共事件后发布一条通知。
自定义通知:
a.创建拉起应用的WantAgentInfo信息。
b.调用getWantAgent()创建WantAgent。
c.构造NotificationRequest对象,并发布携带WantAgent的通知。
d.用户点击通知栏上的通知,会自动拉起对应的应用。
核心代码
发布方:
订阅方:
自定义通知publishNotification:
其它常见问题
1.粘性事件:
emitter对标Node.js,进程内消息分发,业界没有发布粘性的,不支持粘性。粘性事件可以考虑使用自定义公共事件实现。
2.事件处理优先级:
当冷启动时间较长时,需要将一些低优先级任务在主线程空闲的时候去加载,避免阻塞UI线程,可以使用emitter定义事件EventPriority优先级为idle实现。