鸿蒙开发——进程模型

一、进程模型

1、Stage模型应用组件

  • UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。

  • ExtensionAbility组件是基于特定场景(例如服务卡片、输入法等)提供的应用组件

ExtensionAbility分类:

  • InputMethodExtensionAbility、WorkSchedulerExtensionAbility等提供了各类对外服务。

  • ServiceExtensionAbility是SERVICE类型的ExtensionAbility组件,提供后台服务创建、销毁、连接、断开等生命周期回调。当前不支持三方应用实现ServiceExtensionAbility。

  • DataShareExtensionAbility基于ExtensionAbility框架,拉起数据提供方的应用以实现对数据的访问。可以选择性实现数据的增、删、改、查,以及文件打开等功能,并对外共享这些数据。。

2、进程分类

应用中所有的进程都是由系统创建和管理的。每个应用至多并存三类进程:

  • 主进程:应用中(同一Bundle名称)的所有UIAbility、ServiceExtensionAbility和DataShareExtensionAbility均是运行在同一个独立进程(主进程)中。

  • Extension进程:应用中(同一Bundle名称)的所有同一类型ExtensionAbility(除ServiceExtensionAbility和DataShareExtensionAbility外)均是运行在一个独立进程中。

  • Render进程:专门为webview创建的进程,用于加载webview的渲染库

对于系统应用可以通过申请多进程权限,为指定HAP配置一个自定义进程名,该HAP中的UIAbility、DataShareExtensionAbility、ServiceExtensionAbility就会运行在自定义进程中。

3、进程创建

  • 主进程:AMS请求AppSpawn拉起主进程。父进程为AppSpawn进程。

  • Extension进程:AMS请求AppSpawn拉起Extension进程。父进程为AppSpawn进程。

  • Render进程:应用请求AMS,AMS直接请求WebViewSpawn拉起Render进程。

二、进程间通信

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

1、系统角度分类

  • 系统公共事件:CES内部定义的公共事件,当前仅支持系统应用和系统服务发布,例如HAP安装,更新,卸载等公共事件。

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

2、发送方式分类

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

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

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

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

3、事件订阅与发布

动态订阅和静态订阅两种订阅方式。动态订阅与静态订阅最大的区别在于,动态订阅是应用运行时行为,而静态订阅是后台服务无需处于运行状态。

订阅

javascript 复制代码
// 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作

let subscriber: commonEventManager.CommonEventSubscriber | null = null;

// 订阅者信息,其中的event字段需要替换为实际的事件名称。

let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {

events: ['event'],

};

// 创建订阅者回调

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;

})

发布

javascript 复制代码
let options: commonEventManager.CommonEventPublishData = {

code: 1, // 公共事件的初始代码

data: 'initial data', // 公共事件的初始数据

};

// 发布公共事件,其中的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');

}

});
相关推荐
90后的晨仔2 小时前
鸿蒙ArkUI框架中的状态管理
harmonyos
别说我什么都不会18 小时前
OpenHarmony 5.0(API 12)关系型数据库relationalStore 新增本地数据变化监听接口介绍
api·harmonyos
MardaWang19 小时前
HarmonyOS 5.0.4(16) 版本正式发布,支持wearable类型的设备!
华为·harmonyos
余多多_zZ19 小时前
鸿蒙学习手册(HarmonyOSNext_API16)_应用开发UI设计:Swiper
学习·ui·华为·harmonyos·鸿蒙系统
斯~内克19 小时前
鸿蒙网络通信全解析:从网络状态订阅到高效请求实践
网络·php·harmonyos
别说我什么都不会19 小时前
OpenHarmony 5.0Release 开发的在线音乐应用卡片
app·harmonyos
威哥爱编程1 天前
在HarmonyOS NEXT 开发中,如何指定一个号码,拉起系统拨号页面
华为·harmonyos·arkts
The 旺1 天前
《HarmonyOS Next开发进阶:打造功能完备的Todo应用华章》
华为·harmonyos
鸿蒙布道师1 天前
鸿蒙NEXT开发随机工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei