鸿蒙 进程模型-公共事件

前提:基于官网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

相关推荐

  1. 鸿蒙 进程模型-公共事件

    2024-03-10 12:48:04       20 阅读
  2. 鸿蒙:配置事件

    2024-03-10 12:48:04       33 阅读
  3. js 事件模型 事件捕获、事件冒泡

    2024-03-10 12:48:04       16 阅读
  4. js事件模型

    2024-03-10 12:48:04       44 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 12:48:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 12:48:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 12:48:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 12:48:04       20 阅读

热门阅读

  1. 解释 Git 的基本概念和使用方式

    2024-03-10 12:48:04       23 阅读
  2. VGG16-CF-VGG11实验报告

    2024-03-10 12:48:04       23 阅读
  3. vscode中开发goalng,debug时遇到的tools报错问题

    2024-03-10 12:48:04       23 阅读
  4. 用spark进行数据查询常用语法总结

    2024-03-10 12:48:04       24 阅读
  5. 数据仓库的主流分层架构

    2024-03-10 12:48:04       26 阅读
  6. 基于qt实现的类的序列化和反序列化

    2024-03-10 12:48:04       23 阅读
  7. 云原生技术实践:Kubernetes集群的部署与运维

    2024-03-10 12:48:04       19 阅读
  8. pytorch CV入门4-使用MobileNet解决视觉相关问题

    2024-03-10 12:48:04       19 阅读
  9. 【pytorch可视化工具】

    2024-03-10 12:48:04       24 阅读
  10. 基于Python调用SCIP求解器的入门文档

    2024-03-10 12:48:04       28 阅读
  11. Springboot 分片上传客户端Demo

    2024-03-10 12:48:04       26 阅读