当前位置: 首页 > news >正文

【鸿蒙 HarmonyOS 4.0】UIAbility、页面及组件的生命周期

一、背景

主要梳理下鸿蒙系统开发中常用的生命周期

二、UIAbility组件 

UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。

UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页面来实现一个功能模块。每一个UIAbility组件实例,都对应于一个最近任务列表中的任务。

2.1、UIAbility组件生命周期

当用户打开、切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的不同状态之间转换。

UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态,如下图所示。

2.2、生命周期状态说明

2.2.1、Create状态

在应用加载过程中,UIAbility实例创建完成时触发,系统会调用onCreate()回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的UI界面展示。

2.2.2、WindowStageCreate和WindowStageDestroy状态

UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。WindowStage创建完成后会进入onWindowStageCreate()回调,可以在该回调中设置UI界面加载、设置WindowStage的事件订阅。

2.2.3、Foreground和Background状态 

Foreground和Background状态分别在UIAbility实例切换至前台和切换至后台时触发,对应于onForeground()回调和onBackground()回调。

onForeground()回调,在UIAbility的UI界面可见之前,如UIAbility切换至前台时触发。可以在onForeground()回调中申请系统需要的资源,或者重新申请在onBackground()中释放的资源。

onBackground()回调,在UIAbility的UI界面完全不可见之后,如UIAbility切换至后台时候触发。可以在onBackground()回调中释放UI界面不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。

2.2.4、Destroy状态

Destroy状态在UIAbility实例销毁时触发。可以在onDestroy()回调中进行系统资源的释放、数据的保存等操作。

三、页面和自定义组件生命周期

3.1、先明确自定义组件和页面的关系:

①自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。

②页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才可以调用页面的生命周期。

3.2、页面生命周期:

onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。

onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。 onBackPress:当用户点击返回按钮时触发。

3.3、组件生命周期:

①aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。

②aboutToDisappear:在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

以下示例展示了生命周期的调用时机:示例来自于官网文档中心

// Index.ets
import router from '@ohos.router';@Entry
@Component
struct MyComponent {@State showChild: boolean = true;// 只有被@Entry装饰的组件才可以调用页面的生命周期onPageShow() {console.info('Index onPageShow');}// 只有被@Entry装饰的组件才可以调用页面的生命周期onPageHide() {console.info('Index onPageHide');}// 只有被@Entry装饰的组件才可以调用页面的生命周期onBackPress() {console.info('Index onBackPress');}// 组件生命周期aboutToAppear() {console.info('MyComponent aboutToAppear');}// 组件生命周期aboutToDisappear() {console.info('MyComponent aboutToDisappear');}build() {Column() {// this.showChild为true,创建Child子组件,执行Child aboutToAppearif (this.showChild) {Child()}// this.showChild为false,删除Child子组件,执行Child aboutToDisappearButton('delete Child').onClick(() => {this.showChild = false;})// push到Page2页面,执行onPageHideButton('push to next page').onClick(() => {router.pushUrl({ url: 'pages/Page2' });})}}
}@Component
struct Child {@State title: string = 'Hello World';// 组件生命周期aboutToDisappear() {console.info('[lifeCycle] Child aboutToDisappear')}// 组件生命周期aboutToAppear() {console.info('[lifeCycle] Child aboutToAppear')}build() {Text(this.title).fontSize(50).onClick(() => {this.title = 'Hello ArkUI';})}
}

以上示例中,Index页面包含两个自定义组件,一个是被@Entry装饰的MyComponent,也是页面的入口组件,即页面的根节点;一个是Child,是MyComponent的子组件。只有@Entry装饰的节点才可以使页面级别的生命周期方法生效,所以MyComponent中声明了当前Index页面的页面生命周期函数。MyComponent和其子组件Child也同时也声明了组件的生命周期函数。

  • 应用冷启动的初始化流程为:MyComponent aboutToAppear --> MyComponent build --> Child aboutToAppear --> Child build --> Child build执行完毕 --> MyComponent build执行完毕 --> Index onPageShow。
  • 点击“delete Child”,if绑定的this.showChild变成false,删除Child组件,会执行Child aboutToDisappear方法。
  • 点击“push to next page”,调用router.pushUrl接口,跳转到另外一个页面,当前Index页面隐藏,执行页面生命周期Index onPageHide。此处调用的是router.pushUrl接口,Index页面被隐藏,并没有销毁,所以只调用onPageHide。跳转到新页面后,执行初始化新页面的生命周期的流程。
  • 如果调用的是router.replaceUrl,则当前Index页面被销毁,执行的生命周期流程将变为:Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。上文已经提到,组件的销毁是从组件树上直接摘下子树,所以先调用父组件的aboutToDisappear,再调用子组件的aboutToDisappear,然后执行初始化新页面的生命周期流程。
  • 点击返回按钮,触发页面生命周期Index onBackPress,且触发返回一个页面后会导致当前Index页面被销毁。
  • 最小化应用或者应用进入后台,触发Index onPageHide。当前Index页面没有被销毁,所以并不会执行组件的aboutToDisappear。应用回到前台,执行Index onPageShow。
  • 退出应用,执行Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。

相关文章:

【鸿蒙 HarmonyOS 4.0】UIAbility、页面及组件的生命周期

一、背景 主要梳理下鸿蒙系统开发中常用的生命周期 二、UIAbility组件 UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。 UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页…...

jdk动态代理与CGLib动态代理

jdk动态代理 目标对象 package com.study;/*** 目标对象(被代理的对象)**/ public class Target implements TargetInf{public String name;public Target() {}public Target(String name) {this.name name;}public String buyCola (String name){Sys…...

Linux 命令行的世界 :4.操作文件和目录

此时此刻,我们已经准备好了做些真正的工作!这一章节将会介绍以下命令: • cp —复制文件和目录 • mv —移动/重命名文件和目录 • mkdir —创建目录 • rm —删除文件和目录 • ln —创建硬链接和符号链接 图形文件管理器能轻松地实现…...

如何使用ArcGIS Pro生成等高线

无论在制图还是规划中,经常会使用到等高线,大多数情况下,从网上获取的高程数据都是DEM文件,我们可以通过ArcGIS Pro来生成等高线,这里为大家介绍一下生成方法,希望能对你有所帮助。 数据来源 教程所使用的…...

golang学习2,golang开发配置国内镜像

go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct...

Stable Diffusion 绘画入门教程(webui)-ControlNet(线稿约束)

上篇文章介绍了openpose,本篇文章介绍下线稿约束,关于线稿约束有好几个处理器都属于此类型,但是有一些区别。 包含: 1、Canny(硬边缘):识别线条比较多比较细,一般用于更大程度得还原照片 2、ML…...

前端笔记——var let const 之间的区别

Var: 关键字来声明变量。它有以下特点: var声明的变量作用域是函数级的,即在函数内部声明的变量在整个函数范围内可见。 var变量可以被重复声明,而不会引发错误。 var变量会存在变量提升(hoisting)现象&…...

AI工具新革命:从ChatGPT到Sora,生成式AI改变世界

这个春节着实精彩,“春山学”吃透了,不如把目光移向OpenAI又一重磅产品——文生视频大模型Sora。智能新纪元已然开启,因为正如周鸿祎所说:“,Sora的诞生意味着AGI(通用人工智能)的实现将从10年缩短到1年。”…...

C 标准库 - <stdio.h> 详解

在 C 语言中,stdio.h 是一个非常重要的头文件,定义了一系列用于输入和输出的函数、变量和宏。本文将逐一介绍 stdio.h 中定义的函数,并提供每个函数的完整示例。 变量类型 在 stdio.h 中定义了三个变量类型: size_t&#xff1a…...

支付宝小程序中唤起支付(前后端)

Java后台获取支付宝支付唯一订单号 /*** 支付宝小程序支付*/PostMapping(value "/xcxPayZFBTHREE")ResponseBodypublic Map<String,Object> xcxPayZFBTHREE(RequestBody byte[] req) {HashMap<String, Object> objectObjectMap new HashMap<>();…...

AI:139-基于深度学习的语音指令识别与执行

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…...

选择 Python IDE(VSCode、Spyder、Visual Studio 2022和 PyCharm)

前言 当选择 Python 开发工具时&#xff0c;你需要考虑自己的需求、偏好和项目类型。下面是对VSCode、Spyder、Visual Studio 2022和 PyCharm的对比推荐总结&#xff1a; 结论 1、如果你专注于“数据科学”&#xff0c;选择SpyDer没错。 内容 Visual Studio Code (VS Code)…...

Rabbitmq 超时异常解决:PRECONDITION_FAILED - Timeout value used: 1800000 ms.

Rabbitmq 超时异常解决&#xff1a;PRECONDITION_FAILED - Timeout value used: 1800000 ms. 在使用 docker 启动 rabbitmq 的时候&#xff0c;执行一个超长时间的任务&#xff0c;出现了报错。 查询了一下发现&#xff0c;这个问题在于 rabbitmq 默认客户端超时时间是30分钟,…...

Java架构师之路二、数据库:SQL语言、关系型数据库、非关系型数据库、数据一致性、事务管理等。

目录 SQL语言&#xff1a; 关系型数据库&#xff1a; 非关系型数据库&#xff1a; 数据一致性&#xff1a; 事务管理&#xff1a; 上篇&#xff1a;Java架构师之路一、Java基础知识&#xff1a;Java语言特性、集合框架、IO流、多线程、反射、注解等基础知识。-CSDN博客 下…...

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置&#xff0c;并启动软件添加线程组配置线程并发数添加Http取样配置取样&#xff0c;并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…...

springAOP落地实现

文章目录 前言一、熟悉相关概念&#xff1a;1、Aspect&#xff1a;2、Pointcut&#xff1a;3、Before&#xff1a;4、AfterReturning&#xff1a;5、AfterThrowing&#xff1a;6、After&#xff1a;7、Around&#xff1a; 二、具体使用case&#xff1a;1.pom文件2.代码 总结 前…...

Linux学习之vi/vim详细介绍

目录 ​编辑 1. 什么是 vim&#xff1f; 2. vi/vim 的使用 2.1 命令模式 2.2 输入模式 2.3 底线命令模式 3. vi/vim 使用实例 3.1 使用 vi/vim 进入一般模式 3.2 按下 i 进入输入模式(也称为编辑模式)&#xff0c;开始编辑文字 3.3 按下 ESC 按钮回到一般模式…...

【AIGC大模型】跑通wonder3D (windows)

论文链接&#xff1a;https://arxiv.org/pdf/2310.15008.pdf windows10系统 显卡&#xff1a;NVIDIA rtx 2060 一、安装anaconda 二、安装CUDA 11.7 (CUDA Toolkit 11.7 Downloads | NVIDIA Developer) 和 cudnn 8.9.7(cuDNN Archive | NVIDIA Developer)库 CUDA选择自定…...

Opencv(2)深浅拷贝与基本绘图(c++python

Opencv(2)深浅拷贝与基本绘图 文章目录 Opencv(2)深浅拷贝与基本绘图三、深浅拷贝四、HSV色域(1).意义(2).cvtColor()(3).inRange()(4).适应光线 三、深浅拷贝 浅拷贝是指当图像之间进行赋值时&#xff0c;图像数据并未发生复制&#xff0c;而是两个对象都指向同一块内存块。 …...

二叉树与堆

目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3 特殊的二叉树&#xff1a; 2.4 二叉树的性质 2.5 二叉树的…...

VHD/VHDX差分盘:Windows系统合并、回滚与定位

VHD/VHDX差分盘&#xff1a;Windows系统合并、回滚与定位VHD/VHDX 差分盘是 Windows 系统中一种高效的虚拟磁盘管理技术&#xff0c;尤其适用于需要频繁进行系统状态回滚、软件测试或虚拟机镜像管理的场景。通过仅存储与父盘的差异数据&#xff0c;差分盘能够显著节省存储空间&…...

二相四线步进电机驱动全解析:从原理到Proteus仿真避坑指南

二相四线步进电机驱动全解析&#xff1a;从原理到Proteus仿真避坑指南 在工业自动化与嵌入式开发领域&#xff0c;步进电机因其精准的位置控制能力成为不可或缺的执行元件。而二相四线制步进电机凭借结构简单、成本低廉的优势&#xff0c;尤其受到电子工程师和创客群体的青睐。…...

AB Download Manager终极指南:告别杂乱下载,3步打造高效下载工作流

AB Download Manager终极指南&#xff1a;告别杂乱下载&#xff0c;3步打造高效下载工作流 【免费下载链接】ab-download-manager A Download Manager that speeds up your downloads 项目地址: https://gitcode.com/GitHub_Trending/ab/ab-download-manager 还在为下载…...

如何为Obsidian插件添加多语言支持:终极国际化指南

如何为Obsidian插件添加多语言支持&#xff1a;终极国际化指南 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n 如果你正在寻找一款能够帮助你的Obsidian插件突破语言限制的工具&#xff0c;那么Obsidian-i18n正是你需要的…...

保姆级教程:手把手教你将若依(RuoYi)项目从Java 8迁移到Java 17(含Spring Boot 3升级)

保姆级教程&#xff1a;手把手教你将若依(RuoYi)项目从Java 8迁移到Java 17&#xff08;含Spring Boot 3升级&#xff09; 最近几年Java生态发生了翻天覆地的变化&#xff0c;从Java 8到Java 17不仅仅是版本号的跳跃&#xff0c;更是一次技术栈的全面革新。作为国内广泛使用的…...

LangChainJS智能代理开发:构建自主决策的AI系统完整指南

LangChainJS智能代理开发&#xff1a;构建自主决策的AI系统完整指南 【免费下载链接】langchainjs 项目地址: https://gitcode.com/GitHub_Trending/la/langchainjs LangChainJS是一个强大的JavaScript/TypeScript框架&#xff0c;专门用于构建基于大语言模型&#xff…...

跨平台哔哩哔哩内容管理神器:BiliTools全方位使用指南

跨平台哔哩哔哩内容管理神器&#xff1a;BiliTools全方位使用指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bilit/Bili…...

Charticulator:颠覆式图表构建引擎如何让数据工作者实现零代码可视化创新

Charticulator&#xff1a;颠覆式图表构建引擎如何让数据工作者实现零代码可视化创新 【免费下载链接】charticulator Interactive Layout-Aware Construction of Bespoke Charts 项目地址: https://gitcode.com/gh_mirrors/ch/charticulator 数据可视化领域长期面临着模…...

如何快速掌握终端数字雨效果:完整跨平台配置指南

如何快速掌握终端数字雨效果&#xff1a;完整跨平台配置指南 【免费下载链接】cmatrix Terminal based "The Matrix" like implementation 项目地址: https://gitcode.com/gh_mirrors/cm/cmatrix 想在终端中重现《黑客帝国》电影里的经典数字雨场景吗&#xf…...

Opencascade避坑指南:Select()函数7个常见使用误区与调试技巧

Opencascade避坑指南&#xff1a;Select()函数7个常见使用误区与调试技巧 在三维建模和CAD开发领域&#xff0c;Opencascade作为一款强大的开源几何内核&#xff0c;其交互功能一直是开发者关注的焦点。而AIS_InteractiveContext中的Select()函数&#xff0c;作为对象选取的核心…...