鸿蒙开发——进程模型与进程通信

1、进程模型

❓ 什么是进程?

进程是一个正在执行的程序的实例。当我们启动一个程序时,操作系统会创建一个进程,分配给它所需的资源,如内存和CPU时间。每个进程至少有一个线程,即执行线程,负责执行程序的指令。进程是操作系统进行资源分配和调度的基本单位,是操作系统提供给用户和应用程序的一个抽象概念。

在鸿蒙的进程模型中,进程被分为三类:主进程(负责UI的进程)、扩展进程(负责大部分ExtensionAbility)、WebView渲染进程(负责网页渲染的独立进程)。

  • 主进程

应用中(同一Bundle名称)的所有UIAbility、ServiceExtensionAbility和DataShareExtensionAbility均是运行在同一个独立进程(主进程)中,如下图中绿色部分的“Main Process”。

仅系统应用支持构建ServiceExtensionAbility和DataShareExtensionAbility
  • 扩展进程(可能有多个)

应用中(同一Bundle名称)的所有同一类型ExtensionAbility(除ServiceExtensionAbility、DataShareExtensionAbility外)均是运行在一个独立进程中,如下图中蓝色部分的“FormExtensionAbility Process”、“InputMethodExtensionAbility Process”、其他ExtensionAbility Process。

  • WebView进程

WebView拥有独立的渲染进程,如下图中黄色部分的“Render Process”。

图片

2、进程间通信方式

在鸿蒙开发中,需要跨进程通信的原因,是因为每个进程都有自己独立的资源和内存空间,其他进程不能随意访问不同进程的内存和资源。

进程间通信一般有两种方式:1)IPC/RPC;2)公共事件机制。

  • IPC/RPC

IPC(Inter-Process Communication): 使用Binder驱动,用于设备内的跨进程通信。

RPC(Remote Procedure Call):使用软总线驱动,用于跨设备跨进程通信。

由于篇幅原因,IPC和RPC在未来的文章中展开介绍
  • 公共事件机制

公共事件机制多用于一对多的通信场景(公共事件发布者可能存在多个订阅者同时接收事件)

基于鸿蒙的进程模型,针对应用间和应用内存在多个进程的情况,推荐使用公共事件机制来实现进程间通信。

3、公共事件机制

CES(Common Event Service,公共事件服务)为应用程序提供订阅、发布、退订公共事件的能力。

公共事件从系统角度可分为:系统公共事件和自定义公共事件。

  • 系统公共事件:CES内部定义的公共事件,当前仅支持系统应用和系统服务发布,例如HAP安装、更新、卸载等公共事件(系统公共事件参考官方文档定义:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/commoneventmanager-definitions-V5 )

  • 自定义公共事件:应用定义的公共事件,可用于实现跨进程的事件通信能力。

公共事件按发送方式可分为:无序公共事件、有序公共事件和粘性公共事件。

  • 无序公共事件:CES在转发公共事件时,不考虑订阅者是否接收到该事件,也不保证订阅者接收到该事件的顺序与其订阅顺序一致。

  • 有序公共事件:CES在转发公共事件时,根据订阅者设置的优先级等级,优先将公共事件发送给优先级较高的订阅者,等待其成功接收该公共事件之后再将事件发送给优先级较低的订阅者。如果有多个订阅者具有相同的优先级,则他们将随机接收到公共事件。

  • 粘性公共事件:能够让订阅者收到在订阅前已经发送的公共事件就是粘性公共事件。【普通的公共事件只能在订阅后发送才能收到,而粘性公共事件的特殊性就是可以先发送后订阅,同时也支持先订阅后发送。发送粘性事件必须是系统应用或系统服务,粘性事件发送后会一直存在系统中,且发送者需要申请ohos.permission.COMMONEVENT_STICKY权限】

每个应用都可以按需订阅公共事件,订阅成功,当公共事件发布时,系统会将其发送给对应的应用。这些公共事件可能来自系统、其他应用和应用自身。示意图如下:

图片

3.1、发布公共事件

当需要发布某个自定义公共事件时,可以通过publish()方法发布事件。发布的公共事件可以携带数据,供订阅者解析并进行下一步处理。发布公共事件接口定义如下:

// 发布简单的公共事件publish(event: string, callback: AsyncCallback)// 指定发布信息并发布公共事件publish(event: string, options: CommonEventPublishData, callback: AsyncCallback)// CommonEventPublishData 结构定义如下:class CommonEventPublishData {// 表示订阅者包名称,只有包名为bundleName的订阅者才能收到该公共事件。bundleName: string// 表示公共事件的结果代码。code: number// 表示公共事件的自定义结果数据。data: string// 表示订阅者的权限。subscriberPermissions: Array<string>// 表示是否是有序事件。isOrdered: boolean// 表示是否是粘性事件。仅系统应用或系统服务允许发送粘性事件。isSticky: boolean// 表示公共事件的附加信息。parameters: {[key: string]: any}}

👉🏻 发布一个不携带信息的公共事件

不携带信息的公共事件,只能发布无序公共事件。​​​​​​​

// 1. 导入模块import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';import { promptAction } from '@kit.ArkUI';import { hilog } from '@kit.PerformanceAnalysisKit';const TAG: string = 'ProcessModel';const DOMAIN_NUMBER: number = 0xFF00;// ...// 2. 传入需要发布的事件名称和回调函数,发布事件。// 发布公共事件,其中的event字段需要替换为实际的事件名称。commonEventManager.publish('event', (err: BusinessError) => {  if (err) {    hilog.info(DOMAIN_NUMBER, TAG, `PublishCallBack err = ${JSON.stringify(err)}`);  } else {    //...    hilog.info(DOMAIN_NUMBER, TAG, `Publish success`);  }});

👉🏻 发布一个携带信息的公共事件

携带信息的公共事件,可以发布为无序公共事件、有序公共事件和粘性事件,可以通过参数CommonEventPublishData的isOrdered、isSticky的字段进行设置。​​​​​​​

// 导入模块import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';import { hilog } from '@kit.PerformanceAnalysisKit';const TAG: string = 'ProcessModel';const DOMAIN_NUMBER: number = 0xFF00;// 2. 构建需要发布的公共事件信息。let options: commonEventManager.CommonEventPublishData = {  code: 1, // 公共事件的初始代码  data: 'initial data', // 公共事件的初始数据};// 3.传入需要发布的事件名称、需要发布的指定信息和回调函数,发布事件。// 发布公共事件,其中的event字段需要替换为实际的事件名称。commonEventManager.publish('event', options, (err: BusinessError) => {  if (err) {    hilog.error(DOMAIN_NUMBER, TAG, 'PublishCallBack err = ' + JSON.stringify(err));  } else {    //...    hilog.info(DOMAIN_NUMBER, TAG, 'Publish success');  }});

3.2、动态订阅公共事件

动态订阅是指当应用在运行状态时对某个公共事件进行订阅,在运行期间如果有订阅的事件发布那么订阅了这个事件的应用将会收到该事件及其传递的参数。(例如,某应用希望在其运行期间收到电量过低的事件,并根据该事件降低其运行功耗,那么该应用便可动态订阅电量过低事件,收到该事件后关闭一些非必要的任务来降低功耗)

动态订阅公共事件的接口定义如下:​​​​​​​

// 创建订阅者对象(Callback和Promise版本)reateSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback<CommonEventSubscriber>): voidcreateSubscriber(subscribeInfo: CommonEventSubscribeInfo): Promise<CommonEventSubscriber>// 订阅公共事件。subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback): void// CommonEventSubscribeInfo结构定义如下:class CommonEventSubscribeInfo {// 表示要订阅的公共事件。events: Array<string>// 表示发布者的权限,订阅方将只能接收到具有该权限的发送方发布的事件。publisherPermission: string// 表示设备ID,该值必须是同一ohos网络上的现有设备ID。通过@ohos.deviceInfo获取udid,作为订阅者的设备ID。publisherDeviceId: string// 表示用户ID。参数可选,默认值当前用户的ID。如果指定了此参数,则该值必须是系统中现有的用户ID。通过getOsAccountLocalId获取系统账号ID,作为订阅者的用户ID。userId: number// 表示订阅者的优先级。值的范围是-100到1000,超过上下限的优先级将被设置为上下限值。priority: number//表示要订阅的发布者的bundleName。publisherBundleName: string}

👉🏻 动态订阅示例代码如下:​​​​​​​

// 1. 导入模块import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';import { promptAction } from '@kit.ArkUI';import { hilog } from '@kit.PerformanceAnalysisKit';const TAG: string = 'ProcessModel';const DOMAIN_NUMBER: number = 0xFF00;// 2. 创建订阅者信息(结构详见上文中的CommonEventSubscribeInfo)// 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作let subscriber: commonEventManager.CommonEventSubscriber | null = null;// 订阅者信息,其中的event字段需要替换为实际的事件名称。let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {    events: ['event'], // 订阅灭屏公共事件};// 3.创建订阅者,保存返回的订阅者对象subscriber,用于执行后续的订阅、退订等操作。// 创建订阅者回调commonEventManager.createSubscriber(subscribeInfo, (err: BusinessError, data: commonEventManager.CommonEventSubscriber) => {  if (err) {    hilog.error(DOMAIN_NUMBER, TAG, `Failed to create subscriber. Code is ${err.code}, message is ${err.message}`);    return;  }  hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in creating subscriber.');  subscriber = data;})//4. 创建订阅回调函数,订阅回调函数会在接收到事件时触发。订阅回调函数返回的data内包含了公共事件的名称、发布者携带的数据等信息// 订阅公共事件回调if (subscriber !== null) {  commonEventManager.subscribe(subscriber, (err: BusinessError, data: commonEventManager.CommonEventData) => {    if (err) {      hilog.error(DOMAIN_NUMBER, TAG, `Failed to subscribe common event. Code is ${err.code}, message is ${err.message}`);      return;    }    // ...  })} else {  hilog.error(DOMAIN_NUMBER, TAG, `Need create subscriber`);}

⭐️ 其中,订阅回调函数中CommonEventData数据结构定义如下:​​​​​​​

class CommonEventData {// 表示当前接收的公共事件名称。event: string// 表示包名称,当前默认为空。bundleName: string// 表示公共事件的结果代码,用于传递int类型的数据。code: number// 表示公共事件的自定义结果数据,用于传递string类型的数据。data: string// 表示公共事件的附加信息。parameters: {[key: string]: any}}

3.3、取消动态订阅公共事件

动态订阅者完成业务需要时,需要主动取消订阅,订阅者通过调用unsubscribe()方法取消订阅事件。接口定义如下:​​​​​​​

// 取消订阅公共事件unsubscribe(subscriber: CommonEventSubscriber, callback?: AsyncCallback)

👉🏻 取消动态订阅公共事件示例如下:​​​​​​​

// 1. 导入模块import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';import { hilog } from '@kit.PerformanceAnalysisKit';const TAG: string = 'ProcessModel';const DOMAIN_NUMBER: number = 0xFF00;// 2. 根据3.2步骤中介绍的,订阅某个公共事件// 3. 调用CommonEvent中的unsubscribe()方法取消订阅某事件// subscriber为订阅事件时创建的订阅者对象if (this.subscriber !== null) {  commonEventManager.unsubscribe(this.subscriber, (err: BusinessError) => {    if (err) {      hilog.error(DOMAIN_NUMBER, TAG, `UnsubscribeCallBack err = ${JSON.stringify(err)}`);    } else {      hilog.info(DOMAIN_NUMBER, TAG, `Unsubscribe success`);      this.subscriber = null;    }  })}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Pod安装软件将CDN改为国内的镜像

1、碰到错误 在pod install的时候碰到以下的下载错误&#xff1a; 文字错误如下&#xff1a; CDN: trunk URL couldnt be downloaded: https://cdn.jsdelivr.net/cocoa/Specs/5/b/d/OpenCV/2.4.11/OpenCV.podspec.json Response: Timeout was reached CDN: trunk URL couldn…

Windows常用命令-病毒

1.常见端口对应的服务 ftp 21 tenlnet 23 80 web 80-89可能是web 443 ssl心脏滴血漏洞以及一些web漏洞测试 445 smb 1433 mssql 1521 oracle 2082/2083 cpanel主机管理系统登陆(国外用的较多) 2222 da虚拟主机管理系统登陆(国外较多) 3128 squid代理默认端口-漫游内…

DDD中的一些基础概念 观点摘录

系统复杂度来源于哪&#xff1f;也就是DDD存在意义 软件系统的复杂性主要体现在三个方面。 隐晦&#xff1a;一是抽象层面的隐晦&#xff0c;抽象系统时&#xff0c;每个人都有自己特定的视角&#xff0c;你需要站在对方的角度才能明白他为什么这么做&#xff1b;其次是实现层…

统信UOS开发环境支持shell

内置了Bash等流行的Shell环境,用户可编写自动化脚本,极大地提高了系统管理和应用开发效率。 文章目录 一、环境部署1. shell开发环境安装2. shell开发环境配置二、代码示例shell开发案例三、常见问题1. 文件处理2. 错误处理3. 跨平台兼容性一、环境部署 1. shell开发环境安装…

使用compare做简单的点云滤波,并另存为文件

一、打开compare软件后&#xff0c;打开一个pcd文件 二、点击显示的pcd文件对象&#xff0c;出现如图黄色框框 三、点击上边的菜单栏的这个标志 四、出现如下图&#xff0c;此时调整红绿蓝就可以简单的做一下背景的滤波操作 五、我调整蓝色按钮后将背景点云去除&#xff0c;点…

布谷语音源码服务器搭建环境及配置流程

布谷语音源码部署环境安装要求&#xff08;只有在相同的环境下才更容易避免一些不必要的麻烦&#xff09;&#xff1a;●安装Center OS 7.9&#xff0c;我们自己的服务器使用的是7.9建议相同系统&#xff0c;非强制●安装宝塔环境&#xff08;强烈推荐使用&#xff09;●安装软…

奥数与C++小学四年级(第二十题 猜猜看)

参考程序代码&#xff1a; #include <iostream> using namespace std;int main() {// 集合 {1, 2, 3, 4, 5, 6, 7, 8}int set[] {1, 2, 3, 4, 5, 6, 7, 8};// 枚举所有可能的 5 个数for (int i 0; i < 8; i) {for (int j i 1; j < 8; j) {for (int k j 1; k…

关于游戏加加不可以在cs2中显示的解决方案

输入的代码如下 -allow_third_party_software 1.打开steam 右键cs2&#xff0c;打开属性。 然后再这里填上这个代码就可以了

QGIS:HCMGIS插件

插件GitHub地址&#xff1a;https://github.com/thangqd/HCMGIS。 以下对HCMGIS插件进行简单介绍&#xff0c;并演示如何进行地图数据下载。 插件简介 HCMGIS - Basemaps, Download OpenData, Batch Converter, VN-2000 Projections, and Field Calculation Utilities for QGI…

康姿百德典雅床垫功效价格双佳,上班族睡眠升级的秘密武器

卓越支撑&#xff0c;透气之选 —— 康姿百德集团公司典雅床垫引领睡眠新风尚 选择一款优质的床垫对于确保良好的睡眠至关重要&#xff0c;尤其是对于每日辛勤工作的上班族而言。一天结束后&#xff0c;躺在舒适的床垫上&#xff0c;享受深度睡眠的美好体验&#xff0c;是最放…

103 - Lecture 3

SQL - Table and Data Part 2 一、Table Constraints Table constraints can be defined when creating tables. But you can also add constraints to an existing table. 1. Syntax of Constraints • General Syntax: CONSTRAINT name TYPE details; • 约束名称是为了以后…

前端 算法 双指针

文章目录 三数之和移动零盛最多水的容器接雨水 三数之和 leetcode 三数之和 题目链接 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有…

nuPlan最新SOTA,香港科技大学发布基于学习决策范围内的规划PlanScope

nuPlan最新SOTA&#xff0c;香港科技大学发布基于学习决策范围内的规划PlanScope Abstract 在自动驾驶的背景下&#xff0c;基于学习的方法在规划模块的开发中表现出了很大的潜力。在规划模块的训练过程中&#xff0c;直接最小化专家驾驶日志与规划输出之间的差异是一种广泛采…

MATLAB实现人工免疫网络算法(Artificial Immune Network Algorithm, AINA)

1. 免疫网络算法简介 生物免疫系统是自然界中最复杂、最有效的自适应系统之一&#xff0c;它能够识别并清除入侵的病原体&#xff0c;同时保持对自身细胞的忍耐。免疫网络算法是一种借鉴生物免疫系统原理和机制的计算模型 2.算法流程 3.MATLAB代码 完整代码见: https://down…

MySQL初学之旅(1)配置与基础操作

目录 1.前言 2.正文 2.1数据库的发展历程 2.2数据库的基础操作 2.2.1启动服务 2.2.2创建与删除数据库 2.2.3数据类型 2.2.4创建表与删除表 2.3MySQL Workbench基础使用简介 3.小结 1.前言 哈喽大家好吖&#xff0c;今天博主正式开始为大家分享数据库的学习&#xff…

【优选算法】——滑动窗口(下篇)!

目录 1、水果成篮 2、找到字符串中所有字母异位词 3、串联所有单词的子串 4、最小覆盖子串 1、水果成篮 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能…

【Python】heapq模块(操作最小堆,主要用途优先队列)

Python中heapq模块被称为堆队列算法&#xff0c;也成为优先队列算法。堆的主要用途是优先队列和堆排序。 堆&#xff08;二叉树的应用&#xff09;&#xff1a;最小堆&#xff0c;最大堆。 最小堆&#xff1a;父节点小于等于所有子节点&#xff0c;左右子节点无大小要求&…

MFC图形函数学习06——画椭圆弧线函数

绘制椭圆弧线函数是MFC基本绘图函数&#xff0c;这个函数需要的参数比较多&#xff0c;共四对坐标点。前两对坐标点确定椭圆的位置与大小&#xff0c;后两对坐标确定椭圆弧线的起点与终点。 一、绘制椭圆弧线函数 原型&#xff1a;BOOL Arc(int x1,int y1,int x2,int y2…

Nuxt 项目安装时报错 fetch failed (详细)

报错: ERROR Error: Failed to download template from registry: Failed to download https://raw.githubusercontent.com/nuxt/starter/templates/templates/v3.json: TypeError: fetch failed. 报错原因: 对 raw.githubusercontent.com 进行了 DNS 污染,这会导致你的请…

autox.js下载并保存项目到设备使用

最近刷快手极速版薅羊毛&#xff0c;手动刷有点累。因此找到这个。 PS&#xff1a;更多内容请见官方文档&#xff1a;首页 (autoxjs.com) 1.下载工程化环境&#xff1a;https://github.com/kkevsekk1/AutoX/archive/refs/heads/dev-test.zip 手机软件下载软件&#xff1a;Relea…