一、进程模型
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');
}
});