鸿蒙HarmonyOS实战-Stage模型(进程模型)
前言
进程是计算机中运行的程序的实例。它是操作系统对正在执行的程序的一种抽象概念。每个进程都有自己的独立内存空间、运行状态和执行上下文。进程可以包含一个或多个线程,每个线程可以独立执行一部分任务。操作系统通过分配和管理进程资源来实现多任务和并发执行。进程之间可以通过进程间通信机制进行数据交换和协作。
一、进程模型
1.概述
在HarmonyOS中,应用的进程模型是基于多线程的。每个应用会运行在一个独立的进程中,并且应用中的所有UIAbility(即应用的界面部分)会运行在同一个进程中。这意味着应用中的不同界面之间可以通过共享内存和消息传递等方式进行通信。
另外,HarmonyOS中的WebView拥有独立的渲染进程。这是为了提高浏览器的安全性和稳定性。通过将WebView的渲染过程与应用的进程隔离开来,避免了恶意网页对应用进行攻击或造成应用崩溃的情况。
HarmonyOS的进程模型是基于多线程的,应用的界面部分运行在同一个进程中,而WebView拥有独立的渲染进程。这样可以提高应用的安全性和稳定性。
二、公共事件简介
1.概述
HarmonyOS的公共事件服务(Common Event Service,CES)是一种机制,可以为应用程序提供订阅、发布和退订公共事件的能力。这个服务使得不同应用程序之间可以进行事件的交互和通信。
通过CES,应用程序可以定义自己的事件,并将这些事件发布到系统的事件总线上。其他应用程序可以通过订阅感兴趣的事件来接收相关的通知。当有事件发生时,发布者会将事件信息发送到事件总线,然后事件总线会将这些信息传递给所有订阅者。
CES提供了一种可靠的事件通信机制,可以在不同的应用程序之间进行事件的交互。这样,应用程序可以更方便地实现功能的集成和扩展。
在CES中,事件是以消息的形式进行传递的,可以包含任意类型的数据。应用程序可以根据需要定义不同类型的事件,并指定事件的触发条件和处理方式。
公共事件从系统角度可分为:系统公共事件和自定义公共事件

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


2.订阅
订阅是指在发布者-订阅者模式中,订阅者向发布者注册,以接收发布者发送的消息或事件。订阅者可以选择订阅他们感兴趣的特定主题或类型的消息。
在发布订阅模式中,订阅者需要执行以下步骤来进行订阅:
- 创建一个订阅者对象或函数,用于处理接收到的消息或事件。
- 向发布者注册订阅者。这通常通过调用发布者的订阅方法,并传递订阅者对象或函数作为参数来完成。订阅方法可能会要求提供订阅的主题或类型。
- 订阅者被添加到发布者的订阅列表中,以便在有新消息或事件时通知订阅者。
- 当发布者发布消息或触发事件时,订阅者会收到通知,并执行相应的处理逻辑。
订阅者可以随时选择取消订阅,以停止接收发布者的消息。取消订阅通常通过调用发布者的取消订阅方法,并传递订阅者对象或函数作为参数来完成。
通过发布订阅模式,订阅者可以实现松耦合的消息传递,提高系统的可扩展性和灵活性。
2.1 公共事件订阅概述
动态订阅是在应用运行时,动态地调用公共事件订阅的API来实现对公共事件的订阅。这种方式适用于需要根据业务逻辑动态决定是否订阅某个公共事件的情况。例如,一个电子商务应用可能在用户下单时订阅订单创建事件,但在取消订单时取消订阅。
静态订阅是通过配置文件声明和实现继承自StaticSubscriberExtensionAbility的类来实现对公共事件的订阅。这种方式适用于需要一直订阅某个公共事件而不需要动态调整订阅的情况。例如,一个日志服务可能一直订阅用户登录事件,以记录用户的登录日志。
无论是动态订阅还是静态订阅,订阅方都可以实现自己的业务逻辑来处理接收到的公共事件。例如,订阅方可以在接收到订单创建事件时,将订单信息保存到数据库中。通过订阅公共事件,应用可以实现不同模块之间的解耦和灵活的消息传递。
2.2 动态订阅公共事件
注意需要申请权限
import commonEventManager from '@ohos.commonEventManager';
import Base from '@ohos.base';
// 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
let subscriber: commonEventManager.CommonEventSubscriber | null = null;
// 订阅者信息
let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
events: ["usual.event.SCREEN_OFF"], // 订阅灭屏公共事件
}
// 创建订阅者回调
commonEventManager.createSubscriber(subscribeInfo, (err: Base.BusinessError, data: commonEventManager.CommonEventSubscriber) => {
if (err) {
console.error(`Failed to create subscriber. Code is ${err.code}, message is ${err.message}`);
return;
}
console.info('Succeeded in creating subscriber.');
subscriber = data;
// 订阅公共事件回调
})
// 订阅公共事件回调
if (subscriber !== null) {
commonEventManager.subscribe(subscriber, (err: Base.BusinessError, data: commonEventManager.CommonEventData) => {
if (err) {
console.error(`Failed to subscribe common event. Code is ${err.code}, message is ${err.message}`);
return;
}
})
} else {
console.error(`Need create subscriber`);
}
2.3 静态订阅公共事件(仅对系统应用开放)
1、声明一个静态订阅者,首先需要在工程中新建一个ExtensionAbility, 该ExtensionAbility从StaticSubscriberExtensionAbility派生,其代码实现如下:
import StaticSubscriberExtensionAbility from '@ohos.application.StaticSubscriberExtensionAbility'
export default class StaticSubscriber extends StaticSubscriberExtensionAbility {
onReceiveEvent(event) {
console.log('onReceiveEvent, event:' + event.event);
}
}
2、配置文件
{
"module": {
......
"extensionAbilities": [
{
"name": "StaticSubscriber",
"srcEntrance": "./ets/StaticSubscriber/StaticSubscriber.ts",
"description": "$string:StaticSubscriber_desc",
"icon": "$media:icon",
"label": "$string:StaticSubscriber_label",
"type": "staticSubscriber",
"visible": true,
"metadata": [
{
"name": "ohos.extension.staticSubscriber",
"resource": "$profile:subscribe"
}
]
}
]
......
}
}

metadata指向的二级配置文件的通常形式如下:
{
"commonEvents": [
{
"name": "xxx",
"permission": "xxx",
"events":[
"xxx"
]
}
]
}

修改设备系统配置文件 /etc/static_subscriber_config.json,将静态订阅应用者的包名添加至该json文件中即可
{
"xxx",
"ohos.extension.staticSubscriber",
"xxx"
}
2.3 取消动态订阅公共事件
import commonEvent from '@ohos.commonEventManager';
// subscriber为订阅事件时创建的订阅者对象
if (subscriber !== null) {
commonEvent.unsubscribe(subscriber, (err) => {
if (err) {
console.error(`[CommonEvent] UnsubscribeCallBack err=${JSON.stringify(err)}`)
} else {
console.info(`[CommonEvent] Unsubscribe`)
subscriber = null
}
})
}
3.发布
在发布订阅模型中,发布是指将消息发送到主题中。发布者通常不需要关心谁订阅了它们的消息,也不需要知道是否有订阅者。发布者只需要将消息发送到主题,然后该主题负责将消息传递给所有订阅者。
发布订阅模型可以用于实现异步通信,其中发布者和订阅者可以在互不干扰的情况下进行工作。发布者可以继续发布消息,而订阅者可以在需要时接收消息。
3.1 发布不携带信息的公共事件
import commonEvent from '@ohos.commonEventManager';
// 发布公共事件
commonEvent.publish("usual.event.SCREEN_OFF", (err) => {
if (err) {
console.error(`[CommonEvent] PublishCallBack err=${JSON.stringify(err)}`);
} else {
console.info(`[CommonEvent] Publish success`);
}
})
3.2 发布携带信息的公共事件
import commonEvent from '@ohos.commonEventManager';
// 公共事件相关信息
let options = {
code: 1, // 公共事件的初始代码
data: "initial data", // 公共事件的初始数据
}
// 发布公共事件
commonEvent.publish("usual.event.SCREEN_OFF", options, (err) => {
if (err) {
console.error('[CommonEvent] PublishCallBack err=' + JSON.stringify(err));
} else {
console.info('[CommonEvent] Publish success')
}
})
写在最后
- 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing,不定期分享原创知识。
- 更多鸿蒙最新技术知识点,请关注作者博客:https://t.doruo.cn/14DjR1rEY

鸿蒙HarmonyOS实战-Stage模型(进程模型)的更多相关文章
- processModel与ASP.NET进程模型
配置 Microsoft Internet 信息服务 (IIS) Web 服务器上的 ASP.NET 进程模型设置.其作用是配置IIS或IIS中的应用程序池(IIS7及以后版本)的安全性,性能,健壮性 ...
- Nginx-->基础-->理论-->nginx进程模型
一.nginx的进程模型基础 如上图,是nginx的基本进程模型. 1.nginx的master进程与worker进程关系 nginx的master进程负责worker进程的管理,包括创建worker ...
- linux进程模型总结
Linux进程通过一个task_struct结构体描述,在linux/sched.h中定义,通过理解该结构,可更清楚的理解linux进程模型. 包含进程所有信息的task_struct数据 ...
- Nginx学习之六-nginx核心进程模型
一.Nginx整体架构 正常执行中的nginx会有多个进程,最基本的有master process(监控进程,也叫做主进程)和woker process(工作进程),还可能有cache相关进程. 一个 ...
- 【Chromium中文文档】进程模型
进程模型 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Process_ ...
- Chromium模块和进程模型
i. Chromium基本模块 Chromium各模块层级图a) Chromium主要包括如下模块: WebKit: Safari和Chromium,以及任何其他基于WebKit内核的浏览器所共享的 ...
- Linux进程模型
----原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/08/01/2617884.html------ Linux进程通过一个task_st ...
- Nginx的内部(进程)模型
nginx是以多进程的方式来工作的,当然nginx也是支持多线程的方式的,只是我们主流的方式还是多进程的方式,也是nginx的默认方式.nginx采用多进程的方式有诸多好处. (1)nginx在启动后 ...
- Nginx的进程模型及高可用方案(OpenResty)
1. Nginx 进程模型简介 Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程.其中master充当整个进程组与用户的交互接口,同时对进程进行监护 ...
- swoole的进程模型架构
swoole的强大之处就在与其进程模型的设计,既解决了异步问题,又解决了并行. 主线程MainReactor swoole启动后主线程会负责监听server socket,如果有新的连接accept, ...
随机推荐
- 《苏丹的复仇》携手华为HMS生态,实现用户、收入双增长
中国出海中东和北非地区的策略类手游<苏丹的复仇>(Revenge of Sultans,ROS)和华为HMS生态深度合作,为本地用户带来创新游戏体验,成为当地广受欢迎的游戏之一,下载量居应 ...
- openGauss内存引擎中的索引
一.索引 索引是一种用于快速查询和检索数据的数据结构.常见的索引结构有: B 树, B+树和 Hash. 索引的作用就相当于目录的作用.打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一 ...
- Java构建工具:Maven与Gradle的对比
在Java码农的世界里,构建工具一直是一个不可或缺的元素.一开始,世上是只有一个构建工具的那就是Make后来发展为GNU Make.但是由于需求的不断涌现,这个小圈子里又逐渐衍生出其他千奇百怪的构建工 ...
- 如何在macOS上安装Python3并设置本地编程环境
介绍 Python是一种多功能编程语言,可用于许多不同的编程项目.1991年首次出版,其名称灵感来自英国喜剧组织Monty Python,开发团队希望使Python成为一种有趣的语言.易于设置,并以相 ...
- 重新整理 .net core 实践篇—————应用分层[二十四]
前言 简单整理一下分层. 正文 应用程序分层,分为: 1.领域模型层 2.基础设施层 3.应用层 4.共享层 共享层 共享层一般包括下面几个类库. 有一个Core 的类库,比如说BLog.Core. ...
- 自动化部署脚本--一键部署单机版k8s
cat danjiDeploy_k8s.sh #!/bin/bash . /etc/init.d/functions # 版本 VERSION=v1.0.1 # IP地址,默认为本机第一块网卡IP地址 ...
- 如何解决打不开Microsoft Store的痛处?
换了机房后,我最喜欢的计算器和画图3d没有了,网上的方法都行不通,怎么办? 第一步,在百度上搜索你想安装的东西,例如我搜索的画图3d,就会有这个链接. 然后,把这个链接复制到这个网站的搜索框中,就会有 ...
- 使用Git向Gitee仓库推送项目的完整流程
1.安装git 如果没有特殊需求,直接下一步即可:安装链接如下:Git - Downloads (git-scm.com) 2.在Gitee上新建仓库,初始化仓库 3.保存仓库的链接,如下图标记所示 ...
- 力扣607(MySQL)-销售员(简单)
题目: 表: SalesPerson 表: Company 表: Orders 编写一个SQL查询,报告没有任何与名为 "RED" 的公司相关的订单的所有销售人员的姓名. 以 任意 ...
- 力扣601(MySQL)-体育馆的人的流量(困难)
题目: 表:Stadium 编写一个 SQL 查询以找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录. 返回按 visit_date 升序排列 的结果表. 查询结果格式如下所示 示例 ...