鸿蒙 从打开一个新窗口到Stage模型的UIAbility组件

打开一个新的窗口

请添加图片描述

我们首先来实现如何在一个应用中打开一个新窗口,使用的模型是 Stage 模型

  1. 在项目文件里,新建一个 newWindow.ets 新文件
    src/main/ets/pages/newWindow.ets

newWindow.ets文件里面随便写点什么都行,这里是第一步创建的文件

新建的文件可以在 src/main/resources/base/profile/main_pages.json 查看

  1. 新建一个 Ability

src/main/ets 文件=>鼠标右键=>新建=>Ability=>写好新的Ability名字比如这里我写newWindow

  1. ets 文件夹下会出现一个新的 newWindow 文件夹,里面有个新的 newWindow.ets 文件,打开它并修改下面的生命周期函数确保启动文件为第一步新建的文件newWindow.ets
onWindowStageCreate(windowStage: window.WindowStage): void {windowStage.loadContent('pages/newWindow')}
  1. 回到入口文件src/main/ets/pages/Index.ets,加入一个可以跳到新窗口的按钮
import { common } from '@kit.AbilityKit'@Entry
@Component
struct Index {build() {Button('在新窗口打开').onClick(_ => {//getContext() 得到UIAbilityContext对象//得到页面所在UIAbility对应的UIAbilityContext// 强行逆转父类 aslet ctx = getContext() as common.UIAbilityContext//启动一个新的UIAbilityctx.startAbility({bundleName: 'com.example.myapplication', //必需!要启动哪个应用下的UIAbilityabilityName: 'newWindow', //必需!要启动的UIAbility名(参考moduels.json5中的名字)// moduleName: 'entry', //可选的!如果目标Ability在同一个模块下,此属性可以省略})})}
}
// AppScope/app.json5 查看 bundleName

这样就可以打开一个新的窗口了

使用 Want

显式 Want

// 我这里又新建了一个项目,所以有些名字和上面的例子不同
import { common ,Want } from '@kit.AbilityKit'@Entry
@Component
struct Index {build() {Button('在新窗口打开').onClick(_ => {let ctx = getContext() as common.UIAbilityContextlet wantInfo: Want = {bundleName: 'com.example.quanguokefei',abilityName: 'Page1',moduleName: 'entry',}//启动一个新的UIAbilityctx.startAbility(wantInfo)})}
}

隐式 Want

  1. 跳到自定义窗口
    隐式 Want 使用 skills 标签来定义需要使用的能力
  • 先去目录 src/main/module.json5修改需要跳转的窗口
  • 比如我要跳转的窗口是 Page1,加入 actions: ["iampage1"],名字自由取,可以多个
{name: "Page1",srcEntry: "./ets/page1/Page1.ets",description: "$string:Page1_desc",icon: "$media:layered_image",label: "$string:Page1_label",startWindowIcon: "$media:startIcon",startWindowBackground: "$color:start_window_background",skills: [{actions: ["iampage1", "other_name"],},],
}

处理 Want

import { common ,Want } from '@kit.AbilityKit'@Entry
@Component
struct Index {build() {Button('在新窗口打开').onClick(_ => {let ctx = getContext() as common.UIAbilityContext// 在这里只需要action就行let wantInfo: Want = {action:'iampage1'}ctx.startAbility(wantInfo)})}
}

窗口启动模式

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

src/main/module.json5 文件中修改

{"module": {"abilities": [{"name": "Page1Ability","launchType": "singleton | multiton | specified"}]}
}

UIAbility 生命周期

在这里插入图片描述

执行顺序:
首次启动 onCreate → onWindowStageCreate → onForeground
切换到后台 onBackground
从后台重新打开 onForeground
正常退出应用 onBackground → onWindowStageDestroy → onDestroy

窗口已经存在的情况下,从主程序进入,不是窗口视图 onNewWant → onForeground

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

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

相关文章

Linux的日志管理

日志管理服务rsyslogd 配置文件 | 日志类型 | 说明 | | -------------------- | ----------------------------------- | | auth | pam产生的日志 | | authpriv | ssh、ftp等…

【PhysUnits】4.1 类型级比特位实现解释(boolean.rs)

一、源码 该代码实现了一个类型级(type-level)的布尔系统,允许在编译时进行布尔运算。 //! 类型级比特位实现 //! //! 这些是基础的比特位类型,作为本库中其他数值类型的构建基础 //! //! 已实现的**类型运算符**: //! //! - 来自 core::op…

【docker】--数据卷挂载

文章目录 存储卷管理创建存储卷查看存储卷详细信息查看存储卷删除存储卷 存储卷管理 # 目录挂载 docker run -v 本机目录:容器目录#1) # 将容器内部的 “/usr/share/nginx/html” 进行持久化挂载 会在宿主机生成一个随机的存储卷 docker run -v /usr/sh…

双重差分模型学习笔记2(理论)

【DID最全总结】90分钟带你速通双重差分!_哔哩哔哩_bilibili 目录 一、staggered DID 交错双重差分 二、动态双重差分 动态双重差分法公式解释 符号解释 公式逻辑与案例 与标准DID的区别 总结 “双减” 政策动态差分模型 (一)设定处…

预测模型开发与评估:基于机器学习的数据分析实践

在当今数据驱动的时代,预测模型已成为各行各业决策制定的核心工具。本文将分享我在COMP5310课程项目中开发预测模型的经验,探讨从数据清洗到模型优化的完整过程,并提供详细的技术实现代码。 ## 研究问题与数据集 ### 研究问题 我们的研究聚焦…

Java 并发编程归纳总结(可重入锁 | JMM | synchronized 实现原理)

1、锁的可重入 一个不可重入的锁,抢占该锁的方法递归调用自己,或者两个持有该锁的方法之间发生调用,都会发生死锁。以之前实现的显式独占锁为例,在递归调用时会发生死锁: public class MyLock implements Lock {/* 仅…

数据治理域——数据同步设计

摘要 本文主要介绍了数据同步的多种方式,包括直连同步、数据文件同步和数据库日志解析同步。每种方式都有其适用场景、技术特点、优缺点以及适用的数据类型和实时性要求。文章还详细探讨了数据直连同步的特点、工作原理、优点、缺点、适用场景等,并对数…

AI人工智能在教育领域的应用

AI人工智能在教育领域的应用 随着科技的飞速发展,人工智能(AI)逐渐成为推动教育变革的重要力量。AI在教育领域的应用不仅改变了传统的教学模式,还为个性化学习、教育资源优化和教育管理带来了前所未有的机遇。本文将从多个方面探…

ohttps开启群晖ssl证书自动更新

开启群晖ssl证书自动更新OHTTPS ohttps是一个免费自动签发ssl证书、管理、部署的项目。 https://ohttps.com 本文举例以ohttps项目自动部署、更新群晖的ssl证书。 部署 签发证书 打开ohttps-证书管理-创建证书-按你实际情况创建证书。创建部署节点 打开Ohttps-部署节点-添加…

ElasticSearch聚合操作案例

1、根据color分组统计销售数量 只执行聚合分组,不做复杂的聚合统计。在ES中最基础的聚合为terms,相当于 SQL中的count。 在ES中默认为分组数据做排序,使用的是doc_count数据执行降序排列。可以使用 _key元数据,根据分组后的字段数…

SQLite 数据库常见问题及解决方法

一、数据库文件锁定问题 1. 问题表现 在多线程或多进程环境下访问 SQLite 数据库时,常常会出现数据库文件被锁定的情况。当一个进程对数据库执行写操作时,其他进程的读写操作都会被阻塞,导致应用程序出现卡顿甚至无响应。比如在移动应用开发…

DeepSeek基础:PPO、DPO、GRPO概念详解

DeepSeek-R1 的强化学习方案中,其亮点之一在于通过 GRPO 算法取代RLHF 常用的 PPO,通过尽可能减少人类标注数据,设计纯 RL 的环境,用精心设计的奖励机制来训练模型自己学会推理。那么什么是PPO、GRPO,其产生的背景、核…

一分钟了解机器学习

一分钟了解机器学习 A Minute to Know About Machine Learning By JacksonML 1. 什么是机器学习? 机器学习(Machine Learning,ML) 是人工智能的分支,通过从数据中自动学习规律,使计算机无需显式编程即可完成任务。…

mvc-service引入

什么是业务层 1)Model1(JSP)和Model2(模糊的mvc): MVC:Model(模型),View(视图),Controller(控制器) 视图层:用于数据展示以及用户交互的界…

第一次做逆向

题目来源:ctf.show 1、下载附件,发现一个exe和一个txt文件 看看病毒加没加壳,发现没加那就直接放IDA 放到IDA找到main主函数,按F5反编译工具就把他还原成类似C语言的代码 然后我们看逻辑,将flag.txt文件的内容进行加…

docker(四)使用篇二:docker 镜像

在上一章中,我们介绍了 docker 镜像仓库,本文就来介绍 docker 镜像。 一、什么是镜像 docker 镜像本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。 我们可以把…

k8s 1.10.26 一次containerd失败引发kubectl不可用问题

k8s 1.10.26 一次containerd失败引发kubectl不可用问题 开机k8s 1.10.26时,报以下错误 [rootmaster ~]# kubectl get no E0515 08:03:00.914894 7993 memcache.go:265] couldnt get current server API group list: Get "https://192.168.80.50:6443/api?…

今日积累:若依框架配置QQ邮箱,来发邮件,注册账号使用

QQ邮箱SMTP服务器设置 首先,我们需要了解QQ邮箱的SMTP服务器地址。对于QQ邮箱,SMTP服务器地址通常是smtp.qq.com。这个地址适用于所有使用QQ邮箱发送邮件的客户端。 QQ邮箱SMTP端口设置 QQ邮箱提供了两种加密方式:SSL和STARTTLS。根据您选…

无缝部署您的应用程序:将 Jenkins Pipelines 与 ArgoCD 集成

在 DevOps 领域,自动化是主要目标之一。这包括自动化软件部署方式。与其依赖某人在部署软件的机器上进行 rsync/FTP/编写软件,不如使用 CI/CD 的概念。 CI,即持续集成,是通过代码提交创建工件的步骤。这可以是 Docker 镜像&#…

4.2.3 Thymeleaf标准表达式 - 5. 片段表达式

在本次实战中,我们通过 Thymeleaf 的片段表达式实现了模板的模块化和复用。首先,我们定义了一个导航栏片段 navbar,并通过参数 activeTab 动态高亮当前激活的标签。然后,我们在多个页面(如主页、关于页和联系页&#x…