【鸿蒙开发基础学习】UIAbility 组件启动模式

news2024/9/24 5:28:37

UIAbility 组件启动模式

UIAbility 的启动模式是指 UIAbility 实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式:

  1. singleton(单实例模式)
  2. multiton(多实例模式)
  3. specified(指定实例模式)

singleton 启动模式

  • singleton 启动模式为单实例模式,也是默认情况下的启动模式。
    • 每次调用 startAbility() 方法时,如果应用进程中该类型的 UIAbility 实例已经存在,则复用系统中的 UIAbility 实例。系统中只存在唯一一个该 UIAbility 实例,即在最近任务列表中只存在一个该类型的 UIAbility 实例。
    • 图 1 单实例模式演示效果
    • 说明:应用的 UIAbility 实例已创建,该 UIAbility 配置为单实例模式,再次调用 startAbility() 方法启动该 UIAbility 实例。由于启动的还是原来的 UIAbility 实例,并未重新创建一个新的 UIAbility 实例,此时只会进入该 UIAbility 的 onNewWant() 回调,不会进入其 onCreate()onWindowStageCreate() 生命周期回调。
    • 如果需要使用 singleton 启动模式,在 module.json5 配置文件中的 launchType 字段配置为 singleton 即可。
    { 
      "module": { 
        "... 
        "abilities": [ 
          { 
            "launchType": "singleton", 
            "... 
          } 
        ] 
      } 
    } 
    

multiton 启动模式

  • multiton 启动模式为多实例模式,每次调用 startAbility() 方法时,都会在应用进程中创建一个新的该类型 UIAbility 实例。即在最近任务列表中可以看到有多个该类型的 UIAbility 实例。这种情况下可以将 UIAbility 配置为 multiton(多实例模式)。
    • 图 2 多实例模式演示效果
    • multiton 启动模式的开发使用,在 module.json5 配置文件中的 launchType 字段配置为 multiton 即可。
    { 
      "module": { 
        "... 
        "abilities": [ 
          { 
            "launchType": "multiton", 
            "... 
          } 
        ] 
      } 
    } 
    

specified 启动模式

  • specified 启动模式为指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。
    • 图 3 指定实例模式演示效果
    • 例如有两个 UIAbility:EntryAbilitySpecifiedAbilitySpecifiedAbility 配置为指定实例模式启动,需要从 EntryAbility 的页面中启动 SpecifiedAbility
    • SpecifiedAbility 中,将 module.json5 配置文件的 launchType 字段配置为 specified
    { 
      "module": { 
        "... 
        "abilities": [ 
          { 
            "launchType": "specified", 
            "... 
          } 
        ] 
      } 
    } 
    
    • 在创建 UIAbility 实例之前,开发者可以为该实例指定一个唯一的字符串 Key,这样在调用 startAbility() 方法时,应用就可以根据指定的 Key 来识别响应请求的 UIAbility 实例。在 EntryAbility 中,调用 startAbility() 方法时,可以在 want 参数中增加一个自定义参数,例如 instanceKey,以此来区分不同的 UIAbility 实例。
    // 在启动指定实例模式的 UIAbility 时,给每一个 UIAbility 实例配置一个独立的 Key 标识
    // 例如在文档使用场景中,可以用文档路径作为 Key 标识
    import { common, Want } from '@kit.AbilityKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    
    const TAG: string = '[Page_StartModel]';
    const DOMAIN_NUMBER: number = 0xFF00;
    
    function getInstance(): string { 
      return 'KEY'; 
    } 
    
    @Entry 
    @Component 
    struct Page_StartModel { 
      private KEY_NEW = 'KEY'; 
    
      build() { 
        Row() { 
          Column() { 
            //... 
            Button()//... 
             .onClick(() => { 
                let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
                // context 为调用方 UIAbility 的 UIAbilityContext;
                let want: Want = { 
                  deviceId: '', // deviceId 为空表示本设备
                  bundleName: 'com.samples.stagemodelabilitydevelop',
                  abilityName: 'SpecifiedFirstAbility',
                  moduleName: 'entry', // moduleName 非必选
                  parameters: { 
                    // 自定义信息 
                    instanceKey: this.KEY_NEW
                  } 
                }; 
                context.startAbility(want).then(() => {
                  hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in starting SpecifiedAbility.');
                }).catch((err: BusinessError) => {
                  hilog.error(DOMAIN_NUMBER, TAG, `Failed to start SpecifiedAbility. Code is ${err.code}, message is ${err.message}`);
                }) 
                this.KEY_NEW = this.KEY_NEW + 'a';
              }) 
            //... 
            Button()//... 
             .onClick(() => { 
                let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
                // context 为调用方 UIAbility 的 UIAbilityContext;
                let want: Want = { 
                  deviceId: '', // deviceId 为空表示本设备
                  bundleName: 'com.samples.stagemodelabilitydevelop',
                  abilityName: 'SpecifiedSecondAbility',
                  moduleName: 'entry', // moduleName 非必选
                  parameters: { 
                    // 自定义信息 
                    instanceKey: getInstance()
                  } 
                }; 
                context.startAbility(want).then(() => {
                  hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in starting SpecifiedAbility.');
                }).catch((err: BusinessError) => {
                  hilog.error(DOMAIN_NUMBER, TAG, `Failed to start SpecifiedAbility. Code is ${err.code}, message is ${err.message}`);
                }) 
                this.KEY_NEW = this.KEY_NEW + 'a';
              }) 
            //... 
          } 
         .width('100%') 
        } 
       .height('100%') 
      } 
    } 
    
    • 由于 SpecifiedAbility 的启动模式被配置为指定实例启动模式,因此在 SpecifiedAbility 启动之前,会先进入对应的 AbilityStageonAcceptWant() 生命周期回调中,以获取该 UIAbility 实例的 Key 值。然后系统会自动匹配,如果存在与该 UIAbility 实例匹配的 Key,则会启动与之绑定的 UIAbility 实例,并进入该 UIAbility 实例的 onNewWant() 回调函数;否则会创建一个新的 UIAbility 实例,并进入该 UIAbility 实例的 onCreate() 回调函数和 onWindowStageCreate() 回调函数。
    • 示例代码中,通过实现 onAcceptWant() 生命周期回调函数,解析传入的 want 参数,获取自定义参数 instanceKey。业务逻辑会根据这个参数返回一个字符串 Key,用于标识当前 UIAbility 实例。如果返回的 Key 已经对应一个已启动的 UIAbility 实例,系统会将该 UIAbility 实例拉回前台并获焦,而不会创建新的实例。如果返回的 Key 没有对应已启动的 UIAbility 实例,则系统会创建新的 UIAbility 实例并启动。
    import { AbilityStage, Want } from '@kit.AbilityKit';
    
    export default class MyAbilityStage extends AbilityStage {
      onAcceptWant(want: Want): string {
        // 在被调用方的 AbilityStage 中,针对启动模式为 specified 的 UIAbility 返回一个 UIAbility 实例对应的一个 Key 值
        // 当前示例指的是 module1 Module 的 SpecifiedAbility
        if (want.abilityName === 'SpecifiedFirstAbility' || want.abilityName === 'SpecifiedSecondAbility') {
          // 返回的字符串 Key 标识为自定义拼接的字符串内容
          if (want.parameters) { 
            return `SpecifiedAbilityInstance_${want.parameters.instanceKey}`;
          } 
        } 
        //... 
        return 'MyAbilityStage'; 
      } 
    } 
    
    • 说明:当应用的 UIAbility 实例已经被创建,并且配置为指定实例模式时,如果再次调用 startAbility() 方法启动该 UIAbility 实例,且 AbilityStageonAcceptWant() 回调匹配到一个已创建的 UIAbility 实例,则系统会启动原来的 UIAbility 实例,并且不会重新创建一个新的 UIAbility 实例。此时,该 UIAbility 实例的 onNewWant() 回调会被触发,而不会触发 onCreate()onWindowStageCreate() 生命周期回调。
    • 例如在文档应用中,可以为不同的文档实例内容绑定不同的 Key 值。每次新建文档时,可以传入一个新的 Key 值(例如可以将文件的路径作为一个 Key 标识),此时 AbilityStage 中启动 UIAbility 时都会创建一个新的 UIAbility 实例;当新建的文档保存之后,回到桌面,或者新打开一个已保存的文档,回到桌面,此时再次打开该已保存的文档,此时 AbilityStage 中再次启动该 UIAbility 时,打开的仍然是之前原来已保存的文档界面。
    • 以如下步骤所示进行举例说明。
    1. 打开文件 A,对应启动一个新的 UIAbility 实例,例如启动 UIAbility 实例 1。
    2. 在最近任务列表中关闭文件 A 的任务进程,此时 UIAbility 实例 1 被销毁,回到桌面,再次打开文件 A,此时对应启动一个新的 UIAbility 实例,例如启动 UIAbility 实例 2。
    3. 回到桌面,打开文件 B,此时对应启动一个新的 UIAbility 实例,例如启动 UIAbility 实例 3。
    4. 回到桌面,再次打开文件 A,此时仍然启动之前的 UIAbility 实例 2,因为系统会自动匹配 UIAbility 实例的 Key 值,如果存在与之匹配的 Key,则会启动与之绑定的 UIAbility 实例。在此例中,之前启动的 UIAbility 实例 2 与文件 A 绑定的 Key 是相同的,因此系统会拉回 UIAbility 实例 2 并让其获焦,而不会创建新的实例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1996465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WordPress网站克隆:用户指南

在这个数字化时代,拥有自己的网站已经非常普遍了。不管是个人博客还是企业官网,WordPress都提供了便捷的建站方式。但是,有时候我们需要复制一个现有的网站,无论是为了测试新功能还是迁移到新服务器。那么,如何克隆一个…

2024年新能源汽车市场保有量创新高

2024年新能源汽车市场大爆发:渗透率飙升,保有量创新高,充电桩建设驶入快车道 随着2024年新能源汽车市场的持续繁荣,一场前所未有的绿色革命正在全球范围内加速推进。这一年,新能源汽车的渗透率不仅实现了质的飞跃&…

微软超高危漏洞“狂躁许可”安全通告,亚信安全ForCloud快速响应

今日,亚信安全CERT监控到安全社区研究人员发布安全通告,披露了微软“狂躁许可”漏洞(CVE-2024-38077)。该漏洞由于windows系统的远程桌面授权服务存在边界错误而导致。攻击者可以发送其精心制作的数据传递给应用程序,这可能引发基于堆的缓冲区…

Element学习(axios异步加载数据、案例操作)(5)

1、这次学习的是上次还未完成好的恶element案例,对列表数据的异步加载,并渲染展示。 ——>axios来发送异步请求 (1) (2)在vue当中安装axios (注意在当前的项目目录,并且安装完之后…

JAVA—异常

认识异常,学会从报错信息中发现问题,解决问题。并学会构建自定义异常,提醒编程时注意 目录 1.认识异常 2.自定义异常 1.自定义运行时异常 2.自定义编译时异常 3.异常的处理 1.认识异常 异常就是代表程序出现的问题,用来查询B…

海思开发套件体验记录

DAY_01: 前一段时间,仰仗工作室的支持,有幸参加了华为海思社区举办的首批入选星闪开发者体验官活动!!! 今天收到海思官方寄过来的海思星闪派开发套件啦!,很开心,非常感谢…

VScode找python环境 (conda)

第一步 CtrlshiftP 第二步 框框里输入:Python:Select Interpreter

鸿蒙(API 12 Beta3版)【时域可分层视频编码】 音视频编码

基础概念 时域可分层视频编码介绍 可分层视频编码,又叫可分级视频编码、可伸缩视频编码,是视频编码的扩展标准,目前常用的包含SVC(H.264编码标准采用的可伸缩扩展)和SHVC(H.265编码标准采用的可扩展标准&…

【JavaEE初阶】线程安全的集合类

📕 引言 我们之前讲过的集合类,,大部分都不是线程安全的. Vector, Stack, HashTable, 是线程安全的(都是自带了synchronized,不建议用), 其他的集合类不是线程安全的。 注意:加锁不能保证线程一定安全,不加锁也不能确定线程一定…

spark-python

前言:本帖子是看了黑马教学视频结合spark八股,记录一下spark的知识. 一.spark介绍 1.1 spark的运行模式 1.2 spark的架构角色 在讨论spark的架构角色时,首先先回顾一下yarn的架构角色. spark架构角色: 二.standalone 运行原理 2.1standalone架构 standalone中有三类进程: m…

AI称重收银一体秤

系统介绍 专门为零售行业的连锁店量身打造的收银系统,适用于常规超市、生鲜超市、水果店、便利店、零食专卖店、服装店、母婴用品、农贸市场等类型的门店使用。同时线上线下数据打通,线下收银的数据与小程序私域商城中的数据完全同步,如商品…

如何在 Windows 11/10/8/7 中恢复已删除和未保存的记事本文本文件

很多原因都会导致未保存的记事本文本文件丢失。这些包括意外关闭、系统崩溃或电源故障等。无论丢失文本文件的原因是什么,相关的焦虑都是一样的。如果您遇到这种情况,可以使用以下有效方法在 Windows 11/10/8/7 中恢复已删除的文本文件。在这篇文章中&am…

NFT Insider #142:Mocaverse 在 The Sandbox 中推出 Mocaland 体验,Azuki 推出新系列动画片

NFT Insider 浓缩每周 NFT 新闻,为大家带来关于 NFT 最全面、最新鲜、最有价值的讯息。每期周报将从 NFT 市场数据,艺术新闻类,游戏新闻类,虚拟世界类,其他动态类,五个角度剖析 NFT 市场现状,了…

从新手到专家:2024年四大电脑录屏软件满足不同需求

电脑录屏是我们记录和分享信息的重要方式。无论是专业领域的技术演示,还是个人爱好的展示,一个好的录屏工具都能让我们的表达更加生动和直观。下面,就让我们一起探索几款市面上备受好评的电脑录屏软件。 福昕REC 链接:www.foxit…

金九银十,全网最详细的软件测试面试题总结

前面看到了一些面试题,总感觉会用得到,但是看一遍又记不住,所以我把面试题都整合在一起,都是来自各路大佬的分享,为了方便以后自己需要的时候刷一刷,不用再到处找题,今天把自己整理的这些面试题…

A股继续震荡盘整,无力回天还是蓄势待发?

今日A股走势十分反常,恐有大事将要发生了,直奔主题,马上告诉给所有人! 1、今天A股走势反常,昨夜外围纳指上涨2.87%,中概股也大涨了。今天亚太股市也在拉升,而A股却冲高回落,再度翻绿…

牛客JS题(二十八)控制动画

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; css动态效果前提判断类型判断 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charset"utf-8" /><style type"text/css">#rect {width: 100px;he…

面试题(六)

1、等于操作符 “ ” 和全等操作符 “ ” 区别 有类型隐式转换&#xff0c;会先进行类型转换&#xff0c;再确定操作数是否相等&#xff08;若类型比较&#xff09;。 null undefined 结果为 true 没有类型隐式转换&#xff0c;只有两个操作数在不转换的前提下相等&#xff…

如何在 Android 手机/平板电脑上恢复误删除的 DCIM 文件夹

DCIM 文件夹是智能手机和平板电脑上最重要的文件夹之一。许多人报告说他们在 Android 设备上遇到了 DCIM 文件夹为空的问题。实际上&#xff0c;这种情况大多数情况下都会发生&#xff0c;当您意外从 Android 设备中删除 DCIM 文件夹或因病毒攻击、应用程序问题和意外格式化等原…

Android系统安全 — 6.5 Bluetooth安全连接原理

1 蓝牙协议架构和简称 蓝牙协议栈主要分&#xff1a;APPS层&#xff08;应用层&#xff0c;包括音频播放器&#xff0c;蓝牙遥控&#xff0c;智能家居APP等&#xff09;&#xff0c; HOST层&#xff08;中间层协议&#xff0c;包括GAP,SMP,ATT/GATT, L2CAP, AMP Manager&#x…