赞
踩
我在是学习UIAbility组件的启动模式时,发现HarmongOs文档有一些错误,因此在这里记录一下。
我通过代码实践发现UIAbility组件的启动模式其实分为四种:
singleton(单实例模式)
multiton(新的单实例模式)
standard(多实例模式)
specified(指定实例模式)
singleton启动模式为单实例模式,也是默认情况下的启动模式。
每次调用startAbility()方法时,如果应用进程中该类型的UIAbility实例已经存在,则复用系统中的UIAbility实例。系统中只存在唯一一个该UIAbility实例,即在最近任务列表中只存在一个该类型的UIAbility实例。
这也就意味着,如果任务列表中存在该实例时,再次调用startAbility方法不用进入onCreate和onWindowStateCreate生命周期。
需要注意一点的是:虽然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启动模式在HarmongOs文档中称为多实例模式,但是我在实际使用中发现,并不是如文档所说,我把它叫做新的单实例模式。
它在系统中也只存在唯一一个该UIAbility实例,但是它与singleton模式不同的是,再次调用startAbility方法时,它会替换原来的UIAbility实例,并且会进入onCreate和onWindowStateCreate生命周期。
- // 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启动模式为多实例模式,每次调用startAbility()方法时,都会在应用进程中创建一个新的该类型UIAbility实例。即在最近任务列表中可以看到有多个该类型的UIAbility实例。
这也就意味着,如果任务列表中存在该实例时,再次调用startAbility方法会进入onCreate和onWindowStateCreate生命周期。
- // 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启动模式为指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。
在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字段,否则无效。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。