应用程序框架进阶
第一课:应用程序框架进阶
从中级课程开始,课程会更加注重于场景与实际运用,因此中级篇与高级篇就不会从习题开始,而是从课程内容、文档中提炼重要的部分,当然习题作为检验学习成果的一部分,也会在文章中有提到。
核心内容
UIAbility进阶
1. AbilityStage组件容器介绍
在官方的介绍中:
AbilityStage是一个Module级别的组件容器,应用的HAP在首次加载时会创建一个AbilityStage实例,可以对该Module进行初始化等操作。
AbilityStage与Module一一对应,即一个Module拥有一个AbilityStage。
从官方的介绍中,可以看到其应用程序的构建,仍然是一种多模块的构建方式,HAP类似于Java程序中的jar或者war,类比于spring boot框架,相当于spring boot application,负责了该模块的启动、初始化。区别在与spring boot application负责spring容器及其中的bean,AbilityStage负责module中的Ability。
类比总结可以得到以下三点内容:
- AbilityStage 在 HarmonyOS 中是 模块级 的组件容器,类似于 SpringBootApplication 或 ApplicationContext,它用于初始化模块中的Ability,并管理模块的生命周期。
- 在 HAP 被首次加载时,AbilityStage 被实例化并初始化模块中的Ability,这类似于 Spring Boot 启动时通过 @SpringBootApplication 扫描、加载并初始化应用的各个 Bean。
- AbilityStage 负责对模块的初始化,提供模块运行时的必要支持,而 SpringBootApplication 也是负责对整个 Spring 应用的启动和初始化。
2. UIAbility组件的启动模式
在官方的介绍中:
UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式:
- singleton(单实例模式)
- multiton(多实例模式)
- specified(指定实例模式)
- 单实例模式作为默认的启动模式,会每次调用startAbility()方法时,如果应用进程中该类型的UIAbility实例已经存在,则复用系统中的UIAbility实例。系统中只存在唯一一个该UIAbility实例,即在最近任务列表中只存在一个该类型的UIAbility实例。由于启动的还是原来的UIAbility实例,并未重新创建一个新的UIAbility实例,此时只会进入该UIAbility的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。其应用场景也是最广泛的。
- 多实例模式每次调用startAbility()方法时,都会在应用进程中创建一个新的该类型UIAbility实例。即在最近任务列表中可以看到有多个该类型的UIAbility实例。可能在多窗口场景、分屏场景中有很好的应用。
- 指定实例模式针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。在创建UIAbility实例之前,开发者可以为该实例指定一个唯一的字符串Key,这样在调用startAbility()方法时,应用就可以根据指定的Key来识别响应请求的UIAbility实例。在EntryAbility中,调用startAbility()方法时,可以在want参数中增加一个自定义参数,例如instanceKey,以此来区分不同的UIAbility实例。由于SpecifiedAbility的启动模式被配置为指定实例启动模式,因此在SpecifiedAbility启动之前,会先进入对应的AbilityStage的onAcceptWant()生命周期回调中,以获取该UIAbility实例的Key值。然后系统会自动匹配,如果存在与该UIAbility实例匹配的Key,则会启动与之绑定的UIAbility实例,并进入该UIAbility实例的onNewWant()回调函数;否则会创建一个新的UIAbility实例,并进入该UIAbility实例的onCreate()回调函数和onWindowStageCreate()回调函数。
3. UIAbility组件间的交互
在官方介绍中:
UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时,会涉及到启动特定的UIAbility,包括应用内的其他UIAbility、或者其他应用的UIAbility(例如启动三方支付UIAbility)。
在启动应用内的Ability的场景,可以通过在EntryAbility调用startAbility()方法启动UIAbility,want为UIAbility实例启动的入口参数,其中bundleName为待启动应用的Bundle名称,abilityName为待启动的Ability名称,moduleName在待启动的UIAbility属于不同的Module时添加,parameters为自定义信息参数。
// EntryAbility中的某组件的绑定事件
onClick(() => {
// context为Ability对象的成员,在非Ability对象内部调用需要
// 将Context对象传递过去
let wantInfo: Want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.samples.stagemodelabilitydevelop',
moduleName: 'entry', // moduleName非必选
abilityName: 'FuncAbilityA',
parameters: {
// 自定义信息
info: '来自EntryAbility Page_UIAbilityComponentsInteractive页面'
},
};
// context为调用方UIAbility的UIAbilityContext
this.context.startAbility(wantInfo).then(() => {
hilog.info(DOMAIN_NUMBER, TAG, 'startA

最低0.47元/天 解锁文章
101

被折叠的 条评论
为什么被折叠?



