一、背景
我在是学习UIAbility组件的启动模式时,发现HarmongOs文档有一些错误,因此在这里记录一下。
二、介绍UIAbility组件的启动模式
我通过代码实践发现UIAbility组件的启动模式其实分为四种:
-
singleton(单实例模式)
-
multiton(新的单实例模式)
-
standard(多实例模式)
-
specified(指定实例模式)
三、singleton启动模式
1. 介绍
singleton启动模式为单实例模式,也是默认情况下的启动模式。
每次调用startAbility()方法时,如果应用进程中该类型的UIAbility实例已经存在,则复用系统中的UIAbility实例。系统中只存在唯一一个该UIAbility实例,即在最近任务列表中只存在一个该类型的UIAbility实例。
这也就意味着,如果任务列表中存在该实例时,再次调用startAbility方法不用进入onCreate和onWindowStateCreate生命周期。
2. 使用
需要注意一点的是:虽然HarmongOS的文档上面表示Want的参数都是可选的,但是我在实际使用中发现want必须配置deviceId、bundleName和abilityName字段,否则不生效。
// singleton模式特点:(单实例模式)
// 系统中只存在唯一一个该UIAbility实例,
// 在创建该模型时,如果应用进程中该类型的UIAbility实例已经存在,这会复用改实例,不会创建新的实例
Button('创建单实例模式(singleton)').onClick((event: ClickEvent) => {
// 注意:want配置至少有这三个,否打开不了
let want: Want = {
deviceId: '', // 空字符串表示当前设备
bundleName: 'com.example.helloword',
abilityName: 'SingletonAbility'
}
this.context.startAbility(want)
})
在创建的Ability文件中修改要显示的页面,默认是pages/index ,由于singleton是默认模式,所以就不用在module.json文件配置了。(需要根据实际页面使用)
四、multiton启动模式
1. 介绍
multiton启动模式在HarmongOs文档中称为多实例模式,但是我在实际使用中发现,并不是如文档所说,我把它叫做新的单实例模式。
它在系统中也只存在唯一一个该UIAbility实例,但是它与singleton模式不同的是,再次调用startAbility方法时,它会替换原来的UIAbility实例,并且会进入onCreate和onWindowStateCreate生命周期。
2. 使用
// multiton模式特点:(新的单实例模式)(文档中的写法有误)
// 系统中只存在唯一一个该UIAbility实例
// 在创建该模型时,如果应用进程中已经有该类型的UIAbility,就会替代原来的实例
Button('创建新的单实例模式(multiton)').onClick(() => {
let want: Want = {
deviceId: '',
bundleName: 'com.example.helloword',
abilityName: 'MultitonAbility'
}
this.context.startAbility(want)
})
在创建的Ability文件中修改要显示的页面。(需要根据实际页面使用)
在module.json文件中设置模式为multiton
五、standard启动模式
1. 介绍
standard启动模式为多实例模式,每次调用startAbility()方法时,都会在应用进程中创建一个新的该类型UIAbility实例。即在最近任务列表中可以看到有多个该类型的UIAbility实例。
这也就意味着,如果任务列表中存在该实例时,再次调用startAbility方法会进入onCreate和onWindowStateCreate生命周期。
2. 使用
// standard模式特点:(多实例模式)
// 每一次调用startAbility方法时,都会创建一个新的UIAbility实例
// 任务列表中可以看到多个该类型的UIAbility实例
Button('创建多个实例模式standard').onClick((event: ClickEvent) => {
let want: Want = {
deviceId: '',
bundleName: 'com.example.helloword',
abilityName: 'StandardAbility'
}
this.context.startAbility(want)
})
在创建的Ability文件中修改要显示的页面。(需要根据实际页面使用)
配置module.json文件
六、specified启动模式
1. 介绍
specified启动模式为指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。
在UIAbility实例创建之前,允许开发者为该实例创建一个唯一的字符串Key,创建的UIAbility实例绑定Key之后,后续每次调用startAbility()方法时,都会询问应用使用哪个Key对应的UIAbility实例来响应startAbility()请求。运行时由UIAbility内部业务决定是否创建多实例,如果匹配有该UIAbility实例的Key,则直接拉起与之绑定的UIAbility实例,否则创建一个新的UIAbility实例。
// specified模式特点:(指定实例模式)
// 针对一些特殊场景使用(例如文档应用中每次新建文档都希望能创建一个新的文档实例,重复打开一个已保存的文档都希望是同一个文档实例)
// 需要配置自定义信息,添加instanceKey来匹配UIAbility
// 创建新的UIAbility时,通过instanceKey来判断是否存在该实例,如果存在就复用,不存在就创建新的实例
List() {
ForEach(['specified1', 'specified2', 'specified3'], (item) => {
ListItem() {
Button(`创建指定实例模式${item}`).onClick(() => {
let want: Want = {
deviceId: '',
bundleName: 'com.example.helloword',
abilityName: 'SpecifiedAbility',
parameters: { // 自定义信息
instanceKey: item
}
}
this.context.startAbility(want)
})
}
})
}
.width('100%')
.height(0)
.layoutWeight(1)
在创建的Ability文件中修改要显示的页面。(需要根据实际页面使用)
创建一个stage文件,在onAcceptWant方法中决定是否创建一个新的UIAbility实例。
配置module.json文件,需要而外配置srcEntry字段,否则无效。