【鸿蒙开发】第十三章 Stage模型应用组件-线程和进程
当前的进程模型如下图所示。应用中(同一Bundle名称)的所有UIAbility和均是运行在同一个独立进程(主进程)中,如下图中绿色部分的“应用中(同一Bundle名称)的所有同一类型(除和外)均是运行在一个独立进程中,如下图中蓝色部分的“”、“”、其他。WebView拥有独立的渲染进程,如下图中黄色部分的“说明:仅系统应用支持构建ServiceExtensionAbility和DataShare
1 线程模型
Stage模型
下的线程主要有如下三类:主线程
、TaskPool Worker线程
、Worker线程
1.1 主线程
- 执行UI绘制。
- 管理主线程的
ArkTS
引擎实例,使多个UIAbility
组件能够运行在其之上。 - 管理其他线程的
ArkTS
引擎实例,例如使用TaskPool
(任务池)创建任务或取消任务、启动和终止Worker
线程。 - 分发交互事件。
- 处理应用代码的回调,包括事件处理和生命周期管理。
- 接收
TaskPool
以及Worker
线程发送的消息。
1.2 TaskPool Worker线程
- 用于执行耗时操作,支持设置调度优先级、负载均衡等功能,推荐使用。
1.3 Worker线程
- 用于执行耗时操作,支持线程间通信。
TaskPool
与Worker
的运作机制、通信手段和使用方法可以参考TaskPool
和Worker
的对比。
说明:
- TaskPool自行管理线程数量,其生命周期由TaskPool统一管理。Worker线程最多创建8个,其生命周期由开发者自行维护。
- 同一线程中存在多个组件,例如UIAbility组件和UI组件都存在于主线程中。在Stage模型中目前主要使用EventHub进行数据通信。
- 执行hdc shell命令,进入设备的shell命令行。在shell命令行中,执行ps -p -T命令,可以查看指定应用进程的线程信息。其中,为需要指定的应用进程的进程ID。
1.4 线程内通信
EventHub
提供了线程内发送和处理事件的能力,包括对事件订阅、取消订阅、触发事件等。以UIAbility组件与UI之间的数据同步为例,具体使用方法可以参考【鸿蒙开发】第十一章 Stage模型应用组件-UIAbility的6.1 使用EventHub进行数据通信
。
2 进程模型
2.1 进程模型简介
当前的进程模型如下图所示。
- 应用中(同一Bundle名称)的所有
UIAbility
、ServiceExtensionAbility
和DataShareExtensionAbility
均是运行在同一个独立进程(主进程)中,如下图中绿色部分的“Main Process
”。 - 应用中(同一Bundle名称)的所有同一类型
ExtensionAbility
(除ServiceExtensionAbility
和DataShareExtensionAbility
外)均是运行在一个独立进程中,如下图中蓝色部分的“FormExtensionAbility Process
”、“InputMethodExtensionAbility Process
”、其他ExtensionAbility Process
。 WebView
拥有独立的渲染进程,如下图中黄色部分的“Render Process
”。
说明:
仅系统应用支持构建ServiceExtensionAbility和DataShareExtensionAbility。
执行hdc shell命令,进入设备的shell命令行。在shell命令行中,执行ps -ef命令,可以查看所有正在运行的进程信息。
在上述模型基础上,对于系统应用可以通过申请多进程权限(如下图所示),为指定HAP配置一个自定义进程名,该HAP中的UIAbility
、DataShareExtensionAbility
、ServiceExtensionAbility
就会运行在自定义进程中。不同的HAP可以通过配置不同的进程名运行在不同进程中。
2.2 进程间通信
基于当前的进程模型,系统中应用间和应用内都会存在多个进程的情况,因此系统提供了如下两种进程间通信机制:
- 公共事件机制:多用于一对多的通信场景,公共事件发布者可能存在多个订阅者同时接收事件。
- 后台服务机制:通过
ServiceExtensionAbility
的能力实现。
2.3 公共事件机制
CES
(Common Event Service
,公共事件服务)为应用程序提供订阅、发布、退订公共事件的能力。
- 公共事件从系统角度可分为:
系统公共事件
和自定义公共事件
。
- 系统公共事件:
CES
内部定义的公共事件,当前仅支持系统应用和系统服务发布,例如HAP安装,更新,卸载等公共事件。目前支持的系统公共事件请参见系统公共事件列表。 - 自定义公共事件:应用定义的公共事件,可用于实现跨进程的事件通信能力。
- 公共事件按发送方式可分为:
无序公共事件
、有序公共事件
和粘性公共事件
。
- 无序公共事件:
CES
在转发公共事件时,不考虑订阅者是否接收到该事件,也不保证订阅者接收到该事件的顺序与其订阅顺序一致。 - 有序公共事件:
CES
在转发公共事件时,根据订阅者设置的优先级等级,优先将公共事件发送给优先级较高的订阅者,等待其成功接收该公共事件之后再将事件发送给优先级较低的订阅者。如果有多个订阅者具有相同的优先级,则他们将随机接收到公共事件。 - 粘性公共事件:能够让订阅者收到在订阅前已经发送的公共事件就是粘性公共事件。普通的公共事件只能在订阅后发送才能收到,而粘性公共事件的特殊性就是可以先发送后订阅,同时也支持先订阅后发送。发送粘性事件必须是系统应用或系统服务,粘性事件发送后会一直存在系统中,且发送者需要申请
ohos.permission.COMMONEVENT_STICKY
权限,配置方式请参见配置文件权限声明。
每个应用都可以按需订阅公共事件,订阅成功,当公共事件发布时,系统会将其发送给对应的应用。这些公共事件可能来自系统、其他应用和应用自身。
2.4 后台服务机制
Stage
模型通过提供ServiceExtensionAbility
,支持系统应用实现一个后台服务并对外提供相应的能力;系统应用A实现了一个后台服务,三方应用B可以通过连接系统应用A的后台服务与其进行进程间通信。
2.4.1 ServiceExtensionAbility概述
ServiceExtensionAbility
是SERVICE
类型的ExtensionAbility
组件,提供后台服务
能力,其内部持有了一个ServiceExtensionContext
,通过ServiceExtensionContext
提供了丰富的接口供外部使用。
ServiceExtensionAbility
可以被其他组件启动或连接,并根据调用者的请求信息在后台处理相关事务。ServiceExtensionAbility
支持以启动和连接两种形式运行,系统应用可以调用startServiceExtensionAbility()
方法启动后台服务,也可以调用connectServiceExtensionAbility()
方法连接后台服务,而三方应用只能调用connectServiceExtensionAbility()
方法连接后台服务。启动和连接后台服务的差别:
- 启动:AbilityA启动ServiceB,启动后AbilityA和ServiceB为
弱关联
,AbilityA退出后,ServiceB可以继续存在。 - 连接:AbilityA连接ServiceB,连接后AbilityA和ServiceB为
强关联
,AbilityA退出后,ServiceB也一起退出。
此处有如下细节需要注意:
- 若Service只通过
connect
的方式被拉起,那么该Service的生命周期将受客户端控制,当客户端调用一次connectServiceExtensionAbility()
方法,将建立一个连接,当客户端退出或者调用disconnectServiceExtensionAbility()
方法,该连接将断开。当所有连接都断开后,Service将自动退出。 - Service一旦通过
start
的方式被拉起,将不会自动退出,系统应用可以调用stopServiceExtensionAbility()
方法将Service退出。 - 只能在主线程线程中执行
connect/disconnect
操作,不要在Worker、TaskPool
等子线程中执行connect/disconnect
操作。
说明:
- 当前不支持三方应用实现ServiceExtensionAbility。如果三方开发者想要实现后台处理相关事务的功能,可以使用后台任务,具体请参见后台任务。
- 三方应用的UIAbility组件可以通过Context连接系统提供的ServiceExtensionAbility。
- 三方应用需要在前台获焦的情况下才能连接系统提供的ServiceExtensionAbility。
2.4.2 ServiceExtensionAbility生命周期
ServiceExtensionAbility提供了onCreate()、onRequest()、onConnect()、onDisconnect()和onDestroy()生命周期回调,根据需要重写对应的回调方法。下图展示了ServiceExtensionAbility的生命周期。
- onCreate 服务被首次创建时触发该回调,开发者可以在此进行一些初始化的操作,例如注册公共事件监听等。
说明: 如果服务已创建,再次启动该ServiceExtensionAbility不会触发onCreate()回调。
-
onRequest 当另一个组件调用
startServiceExtensionAbility()
方法启动该服务组件时,触发该回调。执行此方法后,服务会启动并在后台运行。每调用一次startServiceExtensionAbility()
方法均会触发该回调。 -
onConnect 当另一个组件调用
connectServiceExtensionAbility()
方法与该服务连接时,触发该回调。开发者在此方法中,返回一个远端代理对象(IRemoteObject),客户端拿到这个对象后可以通过这个对象与服务端进行RPC通信,同时系统侧也会将该远端代理对象(IRemoteObject)储存。后续若有组件再调用connectServiceExtensionAbility()
方法,系统侧会直接将所保存的远端代理对象(IRemoteObject)返回,而不再触发该回调。 -
onDisconnect 当最后一个连接断开时,将触发该回调。客户端死亡或者调用
disconnectServiceExtensionAbility()
方法可以使连接断开。 -
onDestroy 当不再使用服务且准备将其销毁该实例时,触发该回调。开发者可以在该回调中清理资源,如注销监听等。
参考文献:
[1]OpenHarmoney应用开发文档

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)