鸿蒙 进程模型-公共事件

前提:基于官网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一样,逻辑代码编写中订阅(而非配置文件中)

ts 复制代码
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.消费

ts 复制代码
import StaticSubscriberExtensionAbility from '@ohos.application.StaticSubscriberExtensionAbility'

export default class StaticSubscriber extends StaticSubscriberExtensionAbility {
    onReceiveEvent(event) {
        console.log('onReceiveEvent, event:' + event.event);
    }
}

2.声明

json 复制代码
{
  "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.发布事件

ts 复制代码
// 公共事件相关信息
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

相关推荐
以太浮标14 小时前
华为eNSP模拟器综合实验之-DHCP服务中继配置案例
网络·华为·智能路由器·信息与通信
游戏技术分享14 小时前
【鸿蒙游戏技术分享 第75期】AGC后台批量导入商品失败,提示“参数错误”
游戏·华为·harmonyos
No Silver Bullet15 小时前
HarmonyOS NEXT开发进阶(十七):WebView 拉起 H5 页面
华为·harmonyos
liuhaikang15 小时前
【鸿蒙HarmonyOS Next App实战开发】口语小搭档——应用技术实践
harmonyos
北方的流星16 小时前
华为交换机MSTP和VRRP综合应用配置
运维·网络·华为
C雨后彩虹18 小时前
简易内存池
java·数据结构·算法·华为·面试
liuhaikang18 小时前
鸿蒙VR视频播放库——md360player
音视频·vr·harmonyos
北方的流星20 小时前
华为交换机IPv6静态路由、默认路由、RIPng和OSPFv3路由配置
运维·网络·华为
飞露20 小时前
鸿蒙Preview预览文件失败原因
华为·harmonyos
夏小鱼的blog20 小时前
【HarmonyOS应用开发入门】第五期:状态管理V2入门 - 1
harmonyos·状态管理