【鸿蒙】UIAbility组件启动模式的使用

一、背景

我在是学习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字段,否则无效。

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HarmonyOS是一种基于微内核架构的分布式操作系统,而设计模式是在软件开发中用来解决特定问题的重要工具。HarmonyOS 2.3引入了一些常见的设计模式,以便开发人员能够更好地利用它们来构建高效、可靠和易于维护的应用程序。 1. 单例模式:HarmonyOS 2.3中的单例模式用于确保某个类的实例在全局范围内只能存在一个。这在多个模块需要共享数据或状态时非常有用。 2. 观察者模式:观察者模式用于在对象之间建立一种订阅-发布的关系。在HarmonyOS 2.3中,这种模式可以用于建立应用程序组件之间的通信和数据传递机制。 3. 适配器模式:适配器模式用于兼容不同接口之间的差异。在HarmonyOS 2.3中,它可以用于确保不同设备和组件之间可以无缝地进行通信。 4. 建造者模式:建造者模式用于创建对象的复杂结构。在HarmonyOS 2.3中,该模式可以用于快速构建复杂的用户界面,同时保持代码的可读性和可维护性。 5. 桥接模式:桥接模式用于将抽象部分与其实现部分解耦。在HarmonyOS 2.3中,这种模式可以用于实现应用程序组件与底层硬件或服务之间的解耦,提高代码的灵活性和可重用性。 通过使用这些设计模式,HarmonyOS 2.3为开发人员提供了更加灵活和高效的开发工具,使他们能够更好地构建出符合用户需求的应用程序。同时,这些设计模式还能够提高代码的可维护性和可扩展性,为长期的应用程序开发提供了更好的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值