当前位置: 首页 > news >正文

鸿蒙 进程模型-公共事件

前提:基于官网3.1/4.0文档。参考官网文档
基于Android开发体系来进行比较和思考。(或有偏颇,自行斟酌)

一、 概念

  1. 应用中(同一包名)的所有UIAbility运行在同一个独立进程中。
  2. WebView拥有独立的渲染进程。

应该有可以单独指定进程?

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

分为两种公共事件:

系统公共事件:CES内部定义的公共事件,只有系统应用和系统服务才能发布,例如HAP安装,更新,卸载等公共事件。目前支持的系统公共事件详见系统公共事件定义。
自定义公共事件:应用自定义一些公共事件用来实现跨进程的事件通信能力。

公共事件—>Receiver

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

无序公共事件:CES转发公共事件时,不考虑订阅者是否接收到,且订阅者接收到的顺序与其订阅顺序无关。
有序公共事件:CES转发公共事件时,根据订阅者设置的优先级等级,优先将公共事件发送给优先级较高的订阅者,等待其成功接收该公共事件之后再将事件发送给优先级较低的订阅者。如果有多个订阅者具有相同的优先级,则他们将随机接收到公共事件。
粘性公共事件:能够让订阅者收到在订阅前已经发送的公共事件就是粘性公共事件。普通的公共事件只能在订阅后发送才能收到,而粘性公共事件的特殊性就是可以先发送后订阅。发送粘性事件必须是系统应用或系统服务,且需要申请ohos.permission.COMMONEVENT_STICKY权限,配置方式请参阅访问控制授权申请指导。

这一套就是消息通知机制的三种方式,无序、顺序、粘性。

二、功能和使用

公共事件分为静态、动态订阅。

1.动态订阅

和Android一样,逻辑代码编写中订阅(而非配置文件中)

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;// 订阅公共事件回调
})//---// 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}})
}

2.静态订阅

它仅对系统应用开放
这也好理解,毕竟Android系统中静态订阅会耗费电量、内存等,一般应用不用这么重量级的消息订阅方式。

1.消费

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"}]}]......}
}

3.发布事件

// 公共事件相关信息
let options = {code: 1, // 公共事件的初始代码data: "initial data", // 公共事件的初始数据
}//...// 发布公共事件
commonEventManager.publish("custom_event", options, (err) => {if (err) {console.error('[CommonEvent] PublishCallBack err=' + JSON.stringify(err));} else {console.info('[CommonEvent] Publish success')}
})

当然,这个是发布自定义事件的方法,发布系统事件的方法也是一样,将上述custom_event改为系统事件的action,譬如:usual.event.SCREEN_OFF,很明显它是息屏的动作。

三、总结

公共事件—>Receiver

相关文章:

  • 设计模式——2_3 迭代器(Iterator)
  • 【JavaEE】_前端POST请求使用json向后端传参
  • 飞天使-学以致用-devops知识点3-安装jenkins
  • 中文版国产Figma简单好上手
  • 学术论文GPT的源码解读与二次开发:从ChatPaper到gpt_academic
  • CPP编程-CPP11中的内存管理策略模型与名称空间管理探幽(时隔一年,再谈C++抽象内存模型)
  • FlyClient SPV client轻量化
  • 2403C++,C++20协程库
  • Vue router文件中本地路由配置使用i18n【解决tab名称出现undefined,导致i18n没有实现问题】
  • Android开发基础面试题,Android保活黑科技的技术实现
  • gofly接口自定义搜索条件
  • 2024.3.6
  • PTA天梯赛L1 021-030题目解析
  • 《汇编语言》- 读书笔记 - 第13章-int 指令
  • 微服务架构 | 数据同步策略
  •  D - 粉碎叛乱F - 其他起义
  • Fastjson的基本使用方法大全
  • git 常用命令
  • httpie使用详解
  • iOS 颜色设置看我就够了
  • laravel5.5 视图共享数据
  • Protobuf3语言指南
  • 编写高质量JavaScript代码之并发
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 二维平面内的碰撞检测【一】
  • 如何在GitHub上创建个人博客
  • 运行时添加log4j2的appender
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 7行Python代码的人脸识别
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #define用法
  • (搬运以学习)flask 上下文的实现
  • (理论篇)httpmoudle和httphandler一览
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .NET 读取 JSON格式的数据
  • .NET 中让 Task 支持带超时的异步等待
  • .net和php怎么连接,php和apache之间如何连接
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .NET是什么
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • [2016.7 day.5] T2
  • [C++]指针与结构体
  • [CISCN2019 华东南赛区]Web4
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败
  • [hdu2196]Computer树的直径
  • [javaSE] GUI(事件监听机制)
  • [JavaWeb学习] Spring Ioc和DI概念思想
  • [LeetCode] 148. Sort List 链表排序
  • [LeetCode] 93. Restore IP Addresses 复原IP地址
  • [Linux]知识整理(持续更新)
  • [MySQL FAQ]系列 -- 如何利用触发器实现账户权限审计
  • [MySQL光速入门]003 留点作业...