鸿蒙OS开发实例:【消息传递】

介绍

在HarmonyOS中,参考官方指导,其实你会发现在‘指南’和‘API参考’两个文档中,对消息传递使用的技术不是一对一的关系,那么今天这篇文章带你全面了解HarmonyOS 中的消息传递

概况

参照官方指导,我总结了两部分:1. 官方“指南”,即下图中的“Stage模型” 2. 总结的内容,即“消息事件”

开始

EventHub

这个其实是可以帮大家解决几个最常见的消息传递场景:1. UIAbility和其它 2.页面和其它 3. 组件和其它
指导文档:《鸿蒙NEXT星河版开发学习文档》

搜狗高速浏览器截图20240326151450.png

1. 订阅

或者+mau123789是v获得相关文档
this.context.eventHub.on('onConfigurationUpdate', (data) => {//订阅});
复制

2. 发送

let eventhub = this.context.eventHub;
eventhub.emit('onConfigurationUpdate', config);
复制

3. 解除订阅

this.context.eventHub.off('onConfigurationUpdate')
复制

CommonEvent

参照官方指南,其总称简写为CES(全称:Common Event Service),可以监听系统锁屏,时间变化,等等

1. 订阅

usual.event.TIME_TICK : 系统公共事件

harvey.event.CUSTOM_1 : 自定义事件

let subscribeInfo = {events: ["usual.event.TIME_TICK", 'harvey.event.CUSTOM_1']
}// 1. 创建订阅者
commonEventManager.createSubscriber(subscribeInfo, (err, subscriber) => {if (err) {console.error(`Failed to create subscriber. Code is ${err.code}, message is ${err.message}`);return;}console.info('Succeeded in creating subscriber.' + JSON.stringify(subscriber));this.subscriberID = subscriber// 2. 订阅事件回调commonEventManager.subscribe(subscriber, (err, commonEventData) => {if (err) {console.error(`Failed to subscribe common event. Code is ${err.code}, message is ${err.message}`);return;} else {systemDateTime.getCurrentTime(false, (error, data) => {this.mySubscriberInfo = data + '<=>' + JSON.stringify(commonEventData, null, '\t')})}})
})

2. 发送

对于系统级别的公共事件, 三方应用无权发送公共事件(即,即使你发送了,也是不会被收到的)

但是你可以自定义自己的公共事件

commonEventManager.publish('harvey.event.CUSTOM_1', option, (error) => {console.log(JSON.stringify(error))
})

3. 解除订阅

解除时用的是订阅者ID

commonEventManager.unsubscribe(this.subscriberID);

Emitter

1. 订阅

必须要有eventId, 这个代表消息的唯一标识

let innerEvent = {eventId: 1847
};emitter.on(innerEvent, (eventData) => {this.emitterData = process.tid + ' ' + JSON.stringify(eventData)
});

2. 发送

let eventData = {data: {'count': this.emitterCount++,'from': 'emitter',"content": "c","id": 1,}};
let innerEvent = {eventId: 1847,priority: emitter.EventPriority.HIGH
};
emitter.emit(innerEvent, eventData);

3. 解除订阅

emitter.off(1847)

Worker

1. 订阅

import worker from '@ohos.worker';let wk1 = new worker.ThreadWorker("/entry/ets/workers/Worker.ts")wk1.onmessage = (msg) => {}

2. 发送

a)从worker线程中发送
import worker, { ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@ohos.worker';var workerPort : ThreadWorkerGlobalScope = worker.workerPort;workerPort.postMessage({......}
)
b) 从主线程中发送
wk1.dispatchEvent({type: 'message', timeStamp: 0})

3. 解除订阅

//第一种
wk1.off('message')
//第二种
wk1.removeEventListener('message')
//第三种:强制关闭线程
wk1..terminate()

TaskTool 和 Notification

  • [TaskTools]
  • [Notification]

总结

HarmonyOS是一个新系统,还是要实践才可能在真实的业务开发中灵活运用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/578214.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链表合集(easy难度)

合并两个有序链表 双指针法 由于list1和list2都是递增的&#xff0c;可以想到用双指针法。假如当前list1这个指针指向的节点被收入完成&#xff0c;那就list1&#xff1b;如果是list2被收入&#xff0c;那就list2。 具体是list1和节点被收入还是list2的节点被收入&#xff…

Netty核心原理剖析与RPC实践21-25

Netty核心原理剖析与RPC实践21-25 21 技巧篇&#xff1a;延迟任务处理神器之时间轮 HahedWheelTimer Netty 中有很多场景依赖定时任务实现&#xff0c;比较典型的有客户端连接的超时控制、通信双方连接的心跳检测等场景。在学习 Netty Reactor 线程模型时&#xff0c;我们知道…

使用filezilla连接Ubuntu22.04虚拟机

获取电脑IP和虚拟机IP ① 在windows下ctrlR再输入cmd&#xff0c;打开指令窗口&#xff0c;输入 ipconfig 虚拟机连接电脑用的是NAT模式&#xff0c;故看VMnet8的IP地址 ② 查看虚拟机IP地址 终端输入 ifconfig 如果没安装&#xff0c;按提示安装net-tools sudo apt install …

HarmonyOS 应用开发之创建PageAbility

开发者需要重写app.js/app.ets中的生命周期回调函数&#xff0c;开发者通过DevEco Studio开发平台创建PageAbility时&#xff0c;DevEco Studio会在app.js/app.ets中默认生成onCreate()和onDestroy()方法&#xff0c;其他方法需要开发者自行实现。接口说明参见前述章节&#xf…

5.11 Vue配置Element UI框架

Vue配置Element UI框架 目录一、 概要二、 开发前准备1. 搭建Vue框架 三、 安装 Element UI1. 引入 Element UI 依赖2. 在 mian.js 中引入 Element UI 和相关样式&#xff1a;3. 按需引入(非必须, 可忽略)4. 简单构建一个主页面 目录 一、 概要 Element UI 是一个基于 Vue.js …

窥探未来:Web3如何颠覆传统互联网

随着科技的迅速发展&#xff0c;Web3正逐渐成为人们关注的焦点。与传统的Web2相比&#xff0c;Web3代表了一种全新的互联网模式&#xff0c;其潜力和影响力引发了人们对未来的期待和探索。本文将深入探讨Web3如何颠覆传统互联网的各个方面&#xff0c;并展望其可能带来的未来变…

卷积神经网络(CNN)基础知识整理

卷积神经网络&#xff08;CNN&#xff09;基础知识整理 0写在前面 这两天陆续看了一些关于卷积神经网络的视频和博文&#xff0c;把我觉得比较有用的知识和内容梳理一下&#xff0c;理顺逻辑&#xff0c;自己也可加深理解&#xff0c;写在这里&#xff0c;日后想看&#xff0…

3D人体姿态估计项目 | 从2D视频中通过检测人体关键点来估计3D人体姿态实现

项目应用场景 人体姿态估计是关于图像或视频中人体关节的 2D 或 3D 定位。一般来说&#xff0c;这个过程可以分为两个部分&#xff1a;(1) 2D 视频中的 2D 关键点检测&#xff1b;(2) 根据 2D 关键点进行 3D 位姿估计。这个项目使用 Detectron2 从任意的 2D 视频中检测 2D 关节…

太阳能发电园区3D可视化:揭秘绿色能源新纪元

在科技飞速发展的今天&#xff0c;绿色能源已成为推动社会进步的重要力量。太阳能发电作为绿色能源的重要代表&#xff0c;正在全球范围内掀起一股清洁能源的革命浪潮。 太阳能发电园区作为集中展示太阳能发电技术和应用的场所&#xff0c;其规模之大、设备之复杂&#xff0c;常…

政安晨:【Keras机器学习实践要点】(三)—— 编写组件与训练数据

目录 介绍 编写组件 训练模型 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 介绍 通过 Ker…

封装性练习

练习 1 &#xff1a; 创建程序&#xff1a;在其中定义两个类&#xff1a; Person 和 PersonTest 类。定义如下&#xff1a; 用 setAge() 设置人的合法年龄 (0~130) &#xff0c;用 getAge() 返回人的年龄。在 PersonTest 类中实例化 Person 类的对象 b &#xff0c;调用 set…

李雅普诺夫函数

李雅普诺夫函数是一种用于描述动力系统稳定性的数学工具。它在动力系统和控制理论中具有广泛的应用&#xff0c;尤其是在研究非线性系统的稳定性方面。 李雅普诺夫函数通常用于证明动力系统在一些条件下是稳定的。一个李雅普诺夫函数是一个实数值函数&#xff0c;通常表示为 V…