当前位置:   article > 正文

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

鸿蒙ui的启动模式

一、背景

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

  1. // singleton模式特点:(单实例模式)
  2. // 系统中只存在唯一一个该UIAbility实例,
  3. // 在创建该模型时,如果应用进程中该类型的UIAbility实例已经存在,这会复用改实例,不会创建新的实例
  4. Button('创建单实例模式(singleton)').onClick((event: ClickEvent) => {
  5. // 注意:want配置至少有这三个,否打开不了
  6. let want: Want = {
  7. deviceId: '', // 空字符串表示当前设备
  8. bundleName: 'com.example.helloword',
  9. abilityName: 'SingletonAbility'
  10. }
  11. this.context.startAbility(want)
  12. })

在创建的Ability文件中修改要显示的页面,默认是pages/index ,由于singleton是默认模式,所以就不用在module.json文件配置了。(需要根据实际页面使用)

四、multiton启动模式

1. 介绍

multiton启动模式在HarmongOs文档中称为多实例模式,但是我在实际使用中发现,并不是如文档所说,我把它叫做新的单实例模式。

它在系统中也只存在唯一一个该UIAbility实例,但是它与singleton模式不同的是,再次调用startAbility方法时,它会替换原来的UIAbility实例,并且会进入onCreate和onWindowStateCreate生命周期。

2. 使用

  1. // multiton模式特点:(新的单实例模式)(文档中的写法有误)
  2. // 系统中只存在唯一一个该UIAbility实例
  3. // 在创建该模型时,如果应用进程中已经有该类型的UIAbility,就会替代原来的实例
  4. Button('创建新的单实例模式(multiton)').onClick(() => {
  5. let want: Want = {
  6. deviceId: '',
  7. bundleName: 'com.example.helloword',
  8. abilityName: 'MultitonAbility'
  9. }
  10. this.context.startAbility(want)
  11. })

在创建的Ability文件中修改要显示的页面。(需要根据实际页面使用)

在module.json文件中设置模式为multiton 

五、standard启动模式

1. 介绍

standard启动模式为多实例模式,每次调用startAbility()方法时,都会在应用进程中创建一个新的该类型UIAbility实例。即在最近任务列表中可以看到有多个该类型的UIAbility实例。

这也就意味着,如果任务列表中存在该实例时,再次调用startAbility方法会进入onCreate和onWindowStateCreate生命周期。

2. 使用

  1. // standard模式特点:(多实例模式)
  2. // 每一次调用startAbility方法时,都会创建一个新的UIAbility实例
  3. // 任务列表中可以看到多个该类型的UIAbility实例
  4. Button('创建多个实例模式standard').onClick((event: ClickEvent) => {
  5. let want: Want = {
  6. deviceId: '',
  7. bundleName: 'com.example.helloword',
  8. abilityName: 'StandardAbility'
  9. }
  10. this.context.startAbility(want)
  11. })

在创建的Ability文件中修改要显示的页面。(需要根据实际页面使用) 

 配置module.json文件

六、specified启动模式

1. 介绍

specified启动模式为指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。

在UIAbility实例创建之前,允许开发者为该实例创建一个唯一的字符串Key,创建的UIAbility实例绑定Key之后,后续每次调用startAbility()方法时,都会询问应用使用哪个Key对应的UIAbility实例来响应startAbility()请求。运行时由UIAbility内部业务决定是否创建多实例,如果匹配有该UIAbility实例的Key,则直接拉起与之绑定的UIAbility实例,否则创建一个新的UIAbility实例。

  1. // specified模式特点:(指定实例模式)
  2. // 针对一些特殊场景使用(例如文档应用中每次新建文档都希望能创建一个新的文档实例,重复打开一个已保存的文档都希望是同一个文档实例)
  3. // 需要配置自定义信息,添加instanceKey来匹配UIAbility
  4. // 创建新的UIAbility时,通过instanceKey来判断是否存在该实例,如果存在就复用,不存在就创建新的实例
  5. List() {
  6. ForEach(['specified1', 'specified2', 'specified3'], (item) => {
  7. ListItem() {
  8. Button(`创建指定实例模式${item}`).onClick(() => {
  9. let want: Want = {
  10. deviceId: '',
  11. bundleName: 'com.example.helloword',
  12. abilityName: 'SpecifiedAbility',
  13. parameters: { // 自定义信息
  14. instanceKey: item
  15. }
  16. }
  17. this.context.startAbility(want)
  18. })
  19. }
  20. })
  21. }
  22. .width('100%')
  23. .height(0)
  24. .layoutWeight(1)

在创建的Ability文件中修改要显示的页面。(需要根据实际页面使用) 

创建一个stage文件,在onAcceptWant方法中决定是否创建一个新的UIAbility实例。

配置module.json文件,需要而外配置srcEntry字段,否则无效。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/878820
推荐阅读
相关标签
  

闽ICP备14008679号