【HarmonyOS】鸿蒙开发之Stage模型-UIAbility的启动模式——第4.4章

news2024/12/21 11:12:00

UIAbi lity的启动模式简介

一共有四种:singleton,standard,specified,multion。在项目目录的:src/main/module.json5。默认开启模式为singleton(单例模式)。如下图
在这里插入图片描述

singleton(单实例模式)启动模式

每个UIAbility只存在唯一实例。任务列表中只会存在一个相同的UIAbility (会覆盖上一个实例)

代码实例:

{
   "module": {
     ...
     "abilities": [
       {
         "launchType": "singleton",
         ...
       }
     ]
  }
}

standard(标准实例模式)启动模式

每次启动UIAbility都会创建一个新的实例。在任务列表中可能存在一个或多个相同的UIAbility实例。新实例创建后,旧实例依然存在。
好处:实现多开效果

代码实例:

{
   "module": {
     ...
     "abilities": [
       {
         "launchType": "standard",
         ...
       }
     ]
  }
}

multion (多实例模式) 启动模式

每次启动UIAbility都会创建一个新的实例。新实例创建后,旧实例会被移除。
场景: 用户在使用分屏功能时,希望使用两个不同应用(例如备忘录应用和图库应用)之间进行分屏,也希望能使用同一个应用(例如备忘录应用自身)进行分屏。

代码实例:

{
   "module": {
     ...
     "abilities": [
       {
         "launchType": "multion",
         ...
       }
     ]
  }
}

specified(指定实例模式)启动模式

每个UIAbility实例可以设置Key指示。启动UIAbility时,需要制定key,存在key相同实例直接被拉起,不存在则创建新实例

场景: 用户打开文档应用,从文档应用中打开一个文档内容,回到文档应用,继续打开同一个文档,希望打开的还是同一个文档内容;以及在文档应用中新建一个新的文档,每次新建文档,希望打开的都是一个新的空白文档内容。

  1. 第一步:创建新的ability,修改module.json5配置文件
    1.1 在ets文件加载创建新的ability,名字为testAbility
    在这里插入图片描述
    ets多出testAbility文件夹和文件(后续需用用到testAbility文件进行修改)
    在这里插入图片描述

    1.2 创建为后,module.json5文件的module->abilities会多出一个testAbility对象。并修改module.json5配置文件
    在这里插入图片描述

{
   "module": {
     ...
     "abilities": [
     ...,
        {
        "name": "testAbility",
        "srcEntry": "./ets/testability/testAbility.ts",
        "description": "$string:testAbility_desc",
        "icon": "$media:icon",
        "label": "$string:testAbility_label",
        "startWindowIcon": "$media:icon",
        "startWindowBackground": "$color:start_window_background",
        "launchType": "specified",
      }
     ]
  }
}
  1. 第二步:specified启动模式实例代码
    2.1 当前UIAbility调用startAbility方法拉起目标UIAbility
    实例代码:
@Entry
@Component
export struct UiAbilityStartMode{
  //1.1 获取上下文
  private context = getContext(this) as common.UIAbilityContext;

  handleStartAbilityTest(id:number) {
    //1.2 指定要跳转到的UIAbility的信息
    let want:Want = {
      deviceId: '', // deviceId为空表示本设备
      bundleName: 'com.example.myapplication',
      abilityName: 'testAbility',//ability的名称  去项目module.json5文件里的module.abilities.name
      moduleName: 'entry', // 模块名 去项目module.json5文件里的module.name
      parameters: { //参数
        instanceKey: "id_"+id,//UIAbility实例的key
      },
    }
    //1.3 尝试拉起目标UIAbility实例
    this.context.startAbility(want);
  }

  @State num:number[]=[1,2]
  @State curNum:number=1
  build(){
    Column(){
      TitleBar({
        titleBarAttribute:{
          title:"UIAbility启动模式",
          backShow:true,
          backCallback:()=>{
            router.back()
          }
        },
      }){}
      Column(){
        Column(){
          Text("specified启动模式").fontSize(26).margin({bottom:10})
          Button("添加文件").onClick(()=>{
            let numData = this.curNum++
            this.num.push(numData)
            this.handleStartAbilityTest(numData)
          })
          Column(){
            ForEach(this.num,(item,index) => {
              Row(){
                Row(){
                  Image($r("app.media.csdn")).width(26).margin({right:10})
                  Text("文档-"+item).fontColor(Color.White)
                }
                Text("查看文档").fontColor(Color.White)
              }.borderRadius(10).margin({bottom:10}).padding(10)
              .backgroundColor("#409eff").width("90%").justifyContent(FlexAlign.SpaceBetween)
              .onClick(()=>{
                this.handleStartAbilityTest(item)
              })
            })
          }.margin({top:20})
        }

      }.justifyContent(FlexAlign.Center)
      .height("100%")
    }

  }
}

运行结果:
在这里插入图片描述
文档页面页面代码如下:

//文档页面
@Entry
@Component
export struct DocPage{
  //1.1 获取上下文
  private context = getContext(this) as common.UIAbilityContext;

  handleStartAbilityTest() {
    //1.2 指定要跳转到的UIAbility的信息
    let want:Want = {
      deviceId: '', // deviceId为空表示本设备
      bundleName: 'com.example.myapplication',
      abilityName: 'EntryAbility',//ability的名称  去项目module.json5文件里的module.abilities.name
      moduleName: 'entry', // 模块名 去项目module.json5文件里的module.name
    }
    //1.3 尝试拉起目标UIAbility实例
    this.context.startAbility(want);
  }
  build(){
    Column(){
      Text("你成功了")
      Button("返回").onClick(()=>{
        this.handleStartAbilityTest()
      })
    }.justifyContent(FlexAlign.Center)
    .height("100%")
  }
}
  1. 第三步:为目标UIAbility实例生成唯一key
    3.1 在AbilityStage的生命周期回调中,为目标UIAbility实例生成唯一key。
    在ets下创建abilityStage文件夹和文件,获取UIAbility实例key值
    在这里插入图片描述
    代码实例
import AbilityStage from '@ohos.app.ability.AbilityStage';
import Want from '@ohos.app.ability.Want';

//获取UIAbility实例对应的一个Key值
export default class MyAbilityStage extends AbilityStage {
  onAcceptWant(want:Want): string {
    // 在被调用方的AbilityStage中,针对启动模式为specified的UIAbility返回一个UIAbility实例对应的一个Key值
    // 判断当前拉取的ability名称是否为testAbility
    if (want.abilityName === 'testAbility') {
      // 返回的字符串Key标识为自定义拼接的字符串内容
      return `AbilityInstanceKey_${want.parameters.instanceKey}`;
    }

    return '';
  }
}

还需要在module.json5配置文件编辑srcEntry文件路劲(填写你自己的abilityStage.ets文件路径),才能获取key值。
在这里插入图片描述
4. 第四步:修改testability.ts的加载路径为文档页面
在这里插入图片描述

最后重启,点击文档,就能创建不同key的UIAbility实例

踩坑不易,还希望各位大佬支持一下 \textcolor{gray}{踩坑不易,还希望各位大佬支持一下} 踩坑不易,还希望各位大佬支持一下

📃 个人主页: \textcolor{green}{个人主页:} 个人主页: 沉默小管

📃 个人网站: \textcolor{green}{个人网站:} 个人网站: 沉默小管

📃 个人导航网站: \textcolor{green}{个人导航网站:} 个人导航网站: 沉默小管导航网

📃 我的开源项目: \textcolor{green}{我的开源项目:} 我的开源项目: vueCms.cn

🔥 技术交流 Q Q 群: 837051545 \textcolor{green}{技术交流QQ群:837051545} 技术交流QQ群:837051545

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

如果有不懂可以留言,我看到了应该会回复
如有错误,请多多指教

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

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

相关文章

【EI会议征稿通知】第四届控制与智能机器人国际学术会议(ICCIR 2024)

第四届控制与智能机器人国际学术会议(ICCIR 2024) 2024 4th International Conference on Control and Intelligent Robotics 第四届控制与智能机器人国际学术会议(ICCIR 2024)由华南理工大学自动化科学与工程学院主办&#xff…

【Android移动开发】helloworld项目文件剖析

本文讨论了一个Android应用的Gradle项目的各个方面。涵盖了Gradle的启动脚本,项目的配置文件(如build.gradle和gradle.properties),以及应用的源代码和资源文件。具体内容包括了项目结构、Gradle插件的配置、AndroidManifest.xml文…

SSM框架,SpringMVC框架的学习(上)

SpringMVC介绍 Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc ),但它通常被称为“Spring MVC”。 SpringMVC涉及组件 …

复合式统计图绘制方法(3)

复合式统计图绘制方法(3) 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制,饼图环形图绘制较难。 在统计图的应用方面,有时候有两个关联的统计学的样本值要用统计图来表达&#xff0…

Python电能质量扰动信号分类(六)基于扰动信号特征提取的超强机器学习识别模型

目录 往期精彩内容: 前言 1 数据集和特征提取 1.1 数据集导入 1.2 扰动信号特征提取 2超强模型XGBoost——原理介绍 2.1 原理介绍 2.2 特征数据集制作 3 模型评估和对比 3.1 随机森林分类模型 3.2 支持向量机SVM分类模型 3.3 XGBoost分类模型 代码、数据…

windows7怎么改ip地址?win7设置ip地址的步骤

随着网络的普及和技术的不断发展,IP地址对于计算机用户来说,已经不再是一个陌生的概念。在Windows 7操作系统中,根据网络环境和个人需求,有时我们需要手动修改IP地址。本文旨在向读者介绍如何在Windows 7系统中修改IP地址&#xf…

Redis常用指令,jedis与持久化

1.redis常用指令 第一个是key的常用指令,第二个是数据库的常用指令 前面的那些指令都是针对某一个数据类型操作的,现在的都是对所有的操作的 1.key常用指令 key应该设计哪些操作 key是一个字符串,通过key获取redis中保存的数据 对于key…

keil 中使用了cks32F103C8T6的芯片如何安装pack

首先是本来想使用stm32的芯片,结果商家给发过来的无法写入,一查是因为商家把cks的芯片给磨皮了,冒充stm来卖 那就花点时间来研究一下这个cks怎么在keil中写入 好不容易找到一个下载包 Keil.CS32F1xx_DFP.pack 【免费】中科芯CKSF103的PACK…

网络安全: Kali Linux 使用 hping3 阻塞目标主机

目录 一、实验 1.环境 2. 物理机测试远程连接 Windows server 3.Kali Linux 使⽤ hping3 ⼯具 二、问题 1. 常见的 DoS ⽅式有哪些 2.hping3 测试⼯具的命令格式和选项参数 一、实验 1.环境 (1)主机 表1 主机 系统版本IP备注Kali Linux2024.…

Python实现向量自回归移动平均模型(VARMA算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 向量自回归移动平均模型(Vector Autoregressive Moving Average, VARMA)是一种…

在 Rust 中实现 TCP : 2.解析原始字节

解析原始字节 现在已经设置了虚拟网络接口并且它接收了数据位,实现 TCP 之旅的下一步是从接收到的数据字节中解析出数据包。默认情况下,除了从虚拟网络接口发送和接收的数据包之外,还会在数据包前面附加 4 个字节的数据。 Tun/TAP documenta…

Flutter混合栈管理方案对比

1.Google官方(多引擎方案) Google官方建议的方式是多引擎方案,即每次使用一个新的FlutterEngine来渲染Widget树,存在的主要问题是每个引擎都要有比较大的内存等资源消耗,虽然Flutter 2.0之后的FlutterEngineGroup通过在…

AI学习集合-前瞻

AI学习前瞻 工作岗位 算法工程师机器学习工程师图像算法工程师ai工程师NLP高级算法工程师 学习路线 应用场景 计算机视觉技术应用场景 自然语言应用 AI流程 AI拟人流程 机器人历史数据经验模型规律依据模型预测未来依据规律做出判断 AI基本流程 术语所用到的技术手段数据数…

收藏4款免费又好用的甘特图软件

zz-plan zz-plan(https://zz-plan.com/) 是一款基于甘特图的项目管理协作软件。无论项目大小、简单复杂都能轻松管理。任务、进度、工时、资源、周期、依赖关系都能一目了然。支持私有化部署,可完全控制、灵活定制、确保数据安全&#xff0c…

峟思测斜仪:工程斜坡稳定性的精确守护者

在工程建设领域,斜坡的稳定性始终是一个关键的安全问题。斜坡失稳不仅可能导致工程项目的延误,更可能威胁到人们的生命安全。为了有效监测和评估斜坡的稳定性,工程师们依赖于一种先进的设备——峟思测斜仪。 测斜仪的工作原理 峟思测斜仪采用…

分层解耦-IOCDI

内聚:软件中各个功能模块内部的功能联系。 耦合:衡量软件中各个层/模块之间依赖、关联的程度 软件设计原则:高内聚低耦合 控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(…

c++ primer学习笔记(一)

目录 第一章、c快速入门 重点:类的简介 第二章 1、基本内置类型 2、字面值常量 1、整型字面值规则 2、浮点字面值规则 3、布尔字面值 4、字符字面值 5、非打印字符的转义序列 ​编辑 6、字符串字面值 3、变量 1、变量标识符 2、定义和初始化对象 3、…

javaWebssh网上超市销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh网上超市销售管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCA…

【深度学习笔记】计算机视觉——多尺度目标检测

多尺度目标检测 在 sec_anchor中,我们以输入图像的每个像素为中心,生成了多个锚框。 基本而言,这些锚框代表了图像不同区域的样本。 然而,如果为每个像素都生成的锚框,我们最终可能会得到太多需要计算的锚框。 想象一…

第十四届蓝桥杯大赛B组 JAVA 蜗牛 (递归剪枝)

题目描述: 这天,一只蜗牛来到了二维坐标系的原点。 在 x 轴上长有 n 根竹竿。它们平行于 y 轴,底部纵坐标为 0,横坐标分别为 x1, x2, …, xn。竹竿的高度均为无限高,宽度可忽略。蜗牛想要从原点走到第 n 个竹竿的底部也…