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