Stage模型是HarmonyOS 3.1 Develper Preview(API 9)版本开始新增的模型,也是目前HarmonyOS主推且会长期演进的模型。在该模型中,由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”,因此称这种应用模型为Stage模型。本书也主要介绍以Stage模型为主的开发方式。
Stage模型的设计思想
Stage模型之所以成为主推模型,源于其设计思想。Stage模型的设计基于如下3个出发点。
1. 为复杂应用而设计
简化应用复杂度:
- 多个应用组件共享同一个ArkTS引擎(运行ArkTS语言的虚拟机)实例,应用组件之间可以方便的共享对象和状态,同时减少复杂应用运行对内存的占用。
- 采用面向对象的开发方式,使得复杂应用代码可读性高、易维护性好、可扩展性强。
2. 支持多设备和多窗口形态
应用组件管理和窗口管理在架构层面解耦:
- 便于系统对应用组件进行裁剪(无屏设备可裁剪窗口)。
- 便于系统扩展窗口形态。
- 在多设备(如桌面设备和移动设备)上,应用组件可使用同一套生命周期。
3. 平衡应用能力和系统管控成本
Stage模型重新定义应用能力的边界,平衡应用能力和系统管控成本。
- 提供特定场景(如卡片、输入法)的应用组件,以便满足更多的使用场景。
- 规范化后台进程管理:为保障用户体验,Stage模型对后台应用进程进行了有序治理,应用程序不能随意驻留在后台,同时应用后台行为受到严格管理,防止恶意应用行为。
Stage模型的Ability生命周期
在Ability的使用过程中,会有多种生命周期状态。掌握Ability的生命周期,对于应用的开发非常重要。
为了实现多设备形态上的裁剪和多窗口的可扩展性,系统对组件管理和窗口管理进行了解耦。Ability的生命周期包括Create、Foreground、Background、Destroy四个状态,WindowStageCreate和WindowStageDestroy为窗口管理器(WindowStage)在Ability中管理UI界面功能的两个生命周期回调,从而实现Ability与窗口之间的弱耦合。如图所示。
Stage模型的Ability启动模式
Ability的启动模式是指Ability实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式:
- singleton(单实例模式)
- standard(标准实例模式)
- specified(指定实例模式)
1. singleton启动模式
singleton是默认情况下的启动模式。
每次调用startAbility()方法时,如果应用进程中该类型的Ability实例已经存在,则复用系统中的Ability实例。系统中只存在唯一一个该Ability实例,即在最近任务列表中只存在一个该类型的Ability实例。此时,应用的Ability实例已创建,当再次调用startAbility()方法启动该Ability实例,此时只会进入该Ability的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。
如果需要使用singleton启动模式,在module.json5配置文件中的"launchType"字段配置为"singleton"即可。
{
"module": {
// ...
"abilities": [
{
"launchType": "singleton",
// ...
}
]
}
}
2. standard启动模式
在standard启动模式下,每次调用startAbility()方法时,都会在应用进程中创建一个新的该类型Ability实例。即在最近任务列表中可以看到有多个该类型的Ability实例。这种情况下可以将Ability配置为standard。
standard启动模式的开发使用,在module.json5配置文件中的"launchType"字段配置为"standard"即可。
3. specified启动模式
在specified启动模式下,在Ability实例创建之前,允许开发者为该实例创建一个唯一的字符串Key,创建的Ability实例绑定Key之后,后续每次调用startAbility()方法时,都会询问应用使用哪个Key对应的Ability实例来响应startAbility请求。运行时由Ability内部业务决定是否创建多实例,如果匹配有该Ability实例的Key,则直接拉起与之绑定的Ability实例,否则创建一个新的Ability实例。
例如,用户在应用中重复打开同一个文档时,启动的均是最近任务列表中的同一个任务。以及在应用中重复新建文档时,启动的均是最近任务列表中新的任务。这种情况下可以将Ability配置为specified。当再次调用startAbility()方法启动该Ability实例,且AbilityStage的onAcceptWant()回调匹配到一个已创建的Ability实例。此时,再次启动该Ability时,只会进入该Ability的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。
specified启动模式的开发使用,在module.json5配置文件的"launchType"字段配置为"specified"即可。
参考引用
- 《跟老卫学HarmonyOS开发》 开源免费教程,https://github.com/waylau/harmonyos-tutorial
*《鸿蒙 HarmonyOS 应用开发从入门到精通战》(柳伟卫著,北京大学出版社)https://item.jd.com/13696724.html、http://product.dangdang.com/29386650.html - 《鸿蒙HarmonyOS手机应用开发实战》(清华大学出版社2022年1月出版) https://item.jd.com/13568130.html
- “鸿蒙系统实战短视频App 从0到1掌握HarmonyOS”视频教程https://coding.imooc.com/class/674.html