HarmonyOS NEXT 应用开发实战(五、页面的生命周期及使用介绍)

HarmonyOS NEXT是华为推出的最新操作系统,arkUI是其提供的用户界面框架。arkUI的页面生命周期管理对于开发者来说非常重要,因为它涉及到页面的创建、显示、隐藏、销毁等各个阶段。以下是arkUI页面生命周期的介绍及使用举例。

页面的生命周期的作用

页面的生命周期管理在应用开发中具有重要作用,主要体现在以下几个方面:

  1. 资源管理:在不同的生命周期阶段,开发者可以合理分配和释放资源,例如在页面创建时分配内存,在页面销毁时释放内存,从而避免内存泄漏。

  2. 状态保存:通过生命周期方法,可以在页面隐藏时保存当前状态,以便在重新显示时恢复。这样可以提升用户体验,用户返回页面时能够继续之前的操作。

  3. 数据加载和更新:在页面显示时加载数据,确保用户能够看到最新信息。在页面展示前,可以进行必要的数据预处理,提高界面的响应速度和流畅度。

  4. 用户交互处理:根据页面在生命周期中不同的状态,适时处理用户交互,比如在页面隐藏时暂停动画或停止网络请求,减少不必要的操作。

  5. 事件管理:能够更好地管理用户事件,在合适的时机绑定/解绑事件监听器,避免多次绑定导致的性能问题。

  6. 调试和日志记录:通过生命周期方法,可以在各个阶段记录日志,帮助开发者调试应用,了解应用的状态变化和用户行为。

arkUI的自定义组件和页面的关系

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

页面生命周期,即被@Entry装饰的组件生命周期,提供以下生命周期接口:

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

组件生命周期,即一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:

  • aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。
  • aboutToDisappear:在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

生命周期流程如下图所示,下图展示的是被@Entry装饰的组件(页面)生命周期

// Index.ets
import router from '@ohos.router';// Page
@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('create or 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也同时也声明了组件的生命周期函数。

以上示例需要注意的是,区分组件的生命周期和页面的声明周期。只有被@Entry装饰的组件才可以调用页面的生命周期。

// 只有被@Entry装饰的组件才可以调用页面的生命周期onPageShow() {console.info('Index onPageShow');}// 只有被@Entry装饰的组件才可以调用页面的生命周期onPageHide() {console.info('Index onPageHide');}// 只有被@Entry装饰的组件才可以调用页面的生命周期onBackPress() {console.info('Index onBackPress');}
  • 应用冷启动的初始化流程为: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。

页面周期使用举例

比如以下场景,就需要用到页面周期,从一个页面跳转到另一个页面,跳转后的页面需要拿到第一个页面传递过来的参数信息。就需要在第二个页面的生命周期里获取,举例如下:

// Page1.ets
import router from '@ohos.router';@Entry
@Component
struct Page1 {// 页面生命周期方法onPageShow() {console.info('Page1 onPageShow');}// 跳转到Page2并传递数据navigateToPage2() {const data = { message: 'Hello from Page1' };router.pushUrl({ url: 'pages/Page2', params: data });}build() {Column() {Text('This is Page 1').fontSize(30);Button('Go to Page 2').onClick(() => this.navigateToPage2());}}
}// Page2.ets
import router from '@ohos.router';@Entry
@Component
struct Page2 {// 变量用于接收从Page1传来的数据@State message: string = '';// 页面生命周期方法onPageShow() {console.info('Page2 onPageShow');const params = router.getParams(); // 获取传递的参数this.message = params.message; // 赋值给本地状态}// 返回上一页goBack() {router.back(); // 返回上一页面}build() {Column() {Text(this.message).fontSize(30); // 显示接收到的消息Button('Go Back').onClick(() => this.goBack());}}
}

上述示例中,页面路由仍使用了旧的router,仅作为示例。 看官方文档router 已经被标记为「不推荐」了,同时官方推荐使用 Navigation。Navigation 提供了简单易用的分栏模式,如果你有平板/折叠屏适配需求,那么强烈建议你使用 Navigation。关于Navigation路由的介绍,这是后话,后续单独整理一份文档,这里先略过。关于router切换Navigation介绍,可参见官方文档:文档中心-Router切换Navigation

写在最后

最后,推荐下笔者的业余开源app影视项目“爱影家”,推荐分享给与我一样喜欢免费观影的朋友。【注:该项目仅限于学习研究使用!请勿用于其他用途!】

开源地址:爱影家app开源项目介绍及源码

https://gitee.com/yyz116/imovie

💖技术交流

 

 

其他资源

HarmonyOS NEXT应用开发(一、打造最好用的网络通信模块组件)-CSDN博客

OpenHarmony三方库中心仓

UIAbility组件生命周期

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

鸿蒙开发ArkTS 页面和自定义组件的生命周期 - 亲爱的老王哥 - 博客园

一、鸿蒙ArkTS/ArkUI实战-页面和自定义组件生命周期 - 简书

官方 Router切换Navigation 指导

【HarmonyOS】听说你还在用 router 做页面路由?我们知道鸿蒙上使用 router 模块进行页面跳转,转眼几 - 掘金

「HarmonyNextOS」页面路由跳转Router更换为Navigation_harmonyos next 页面跳转-CSDN博客

文档中心-设置组件导航和页面路由

【OpenHarmony】ArkTS 语法基础 ③ ( @Component 自定义组件生命周期回调函数 | @Entry 页面生命周期回调函数 )_wx5c66153045676的技术博客_51CTO博客

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

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

相关文章

【正点原子K210连载】第四十六章 车牌识别实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第四十六章 车牌识别实验 在上一章节中,介绍了利用maix.KPU模块实现了通过提取图像中人脸的特征进行人脸识别,本章将继续介绍利用maix.KPU模块实现的车牌识别。通过本章的学习,读者将学习到车牌识别应用在CanMV上的实现。 本章分为如下几个小…

视觉识别技术:开启智能视觉新时代

引言 在数字化时代,信息的获取和处理变得前所未有的重要。视觉识别技术,作为人工智能领域的一个重要分支,正在逐渐改变我们与数字世界的互动方式。它通过模拟人类视觉系统,使计算机能够识别和理解图像和视频中的内容,…

LeetCode-四数相加-Java

一、题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;nums1…

Shell案例之一键部署mysql

1.问题 我认为啊学习就是一个思考的过程&#xff0c;思考问题的一个流程应该是&#xff1a;提出问题&#xff0c;分析问题&#xff0c;解决问题 在shell里部署mysql服务时&#xff0c;我出现一些问题&#xff1a; 1.安装mysql-server时&#xff0c;没有密钥&#xff0c;安装…

普通java web项目集成spring-session

之前的老项目&#xff0c;希望使用spring-session管理会话&#xff0c;存储到redis。 项目环境&#xff1a;eclipse、jdk8、jetty嵌入式启动、非spring项目。 实现思路&#xff1a; 1.添加相关依赖jar。 2.配置redis连接。 3.配置启动spring。 4.配置过滤器&#xff0c;拦…

宏观经济分析应该看哪些指标?

文章目录 1.国内生产总值(GDP)1.1 GDP(国内生产总值)2. 失业率2.1 城镇登记失业率2.2 调查失业率2.3 青年失业率2.4 长期失业率3. 通货膨胀率3.1 CPI(消费者物价指数):3.2 PPI(生产者物价指数):4. 利率4.1 贷款市场报价利率(LPR)4.2 金融机构贷款基准利率4.3 存款基…

L1练习-鸢尾花数据集处理(分类/聚类)

背景 前文&#xff08;《AI 自学 Lesson1 - Sklearn&#xff08;开源Python机器学习包&#xff09;》&#xff09;以鸢尾花数据集的处理为例&#xff0c;本文将完善其代码&#xff0c;在使用 sklearn 的部分工具包基础上&#xff0c;增加部分数据预处理、数据分析和数据可视化…

QUIC 协议的优势

QUIC 协议的优势包括&#xff1a; 快速建立连接&#xff1a;将传输层和加密层的握手合并&#xff0c;减少了连接建立的延迟。QUIC 建连时间大约为 0~1RTT&#xff0c;相比 HTTPS 的 3RTT 建连&#xff0c;具有极大的优势。客户端第一次建连的握手协商需 1RTT&#xff0c;而已建…

Linux 和Windows创建共享文件夹实现文件共享

直接开整 1.Windows下创建共享文件夹share右击-》属性—》共享-》选择所有人-》点击共享 2.共享创建完成后可以使他的共享网络地址或者Windows ip地址-推荐使用Windows ip地址有时候 不知道什么原因他Linux解析不了网络地址 共享网络地址 —共享文件夹share 右击-》属性—》共…

扫普通链接二维码打开小程序

1. 2.新增规则&#xff08;注意下载文件到跟目录下&#xff0c;需要建个文件夹放下载的校验文件&#xff09; 3.发布 ps&#xff1a;发布后&#xff0c;只能访问正式版本。体验版本如果加了 测试链接http://xxx/xsc/10 那么http://xxx/xsc/aa.....应该都能访问 例如aa101 aa…

CMOS晶体管的串联与并联

CMOS晶体管的串联与并联 前言 对于mos管的串联和并联&#xff0c;一直没有整明白&#xff0c;特别是设计到EDA软件中&#xff0c;关于MOS的M和F参数&#xff0c;就更困惑了&#xff0c;今天看了许多资料以及在EDA软件上验证了电路结构与版图的对应关系&#xff0c;总算有点收…

操作系统(6) (Named /Unnamed Semaphore信号量详解)

目录 1: 信号量的基本概念 2: 命名信号量的示例代码 3. 无名信号量&#xff08;Unnamed Semaphore&#xff09; 背景&#xff08;Background&#xff09; 示例代码讲解 初始化无名信号量 线程函数 创建线程并等待完成 销毁信号量 总结 4. 对比 1: 信号量的基本概念 背…

VScode中CMake无高亮(就是没有补全的提示)

在我学的过程中我发现我的CMake是这样的&#xff0c;如下图 但在教学视频里是这样的&#xff08;如下图&#xff09; 这非常的难受&#xff0c;所以疯狂的找&#xff0c;最后是CMake报错有 原因就是&#xff1a;本地没有配置环境变量&#xff0c;解决方法是下一个cmake然后直接…

JS-常用功能

前言 在工作中&#xff0c;有些js功能经常需要用到&#xff0c;但是在真正用的时候&#xff0c;每次都是百度。可能一时半会还找不到正确的。所以这里把经常用到的js功能&#xff0c;汇总一下&#xff0c;后续还会继续完善。 目录 input只能输入0~100&#xff0c;并且是正整…

STM32-CubeIDE用串口通讯

USART串口通讯 一、轮询模式 1.设置所接引脚为UART异步模式 选择完成CTRLS保存。 2.编写测试代码&#xff08;自动发送hello world&#xff09; 在mian函数里面编写代码 原函数 调用函数&#xff0c;需要数据类型一致&#xff0c;使用函数通过串口发送数组里面的数据 打开串…

C++中库和包的区别

在C开发中&#xff0c;“库”&#xff08;Library&#xff09;和“包”&#xff08;Package&#xff09;是两个常见但有不同含义的术语。理解它们之间的区别有助于更有效地管理和使用代码资源。 库&#xff08;Library&#xff09; 定义&#xff1a; 库是预先编译好的代码集合…

延迟队列实现及其原理详解

1.绪论 本文主要讲解常见的几种延迟队列的实现方式&#xff0c;以及其原理。 2.延迟队列的使用场景 延迟队列主要用于解决每个被调度的任务开始执行的时间不一致的场景&#xff0c;主要包含如下场景: 1.比如订单超过15分钟后&#xff0c;关闭未关闭的订单。 2.比如用户可以…

【嵌入式设备】蓝牙鼠标遥控器

今天讲的这个产品也是刚开发的 主要就是可以遥控你的设备&#xff0c;进行一些自动化的操作流程&#xff0c;不需要再一个一个去单独进行操作&#xff0c;举个最简单的例子&#xff0c;比如你需要拨打一个电话号&#xff0c;你是不是需要一个一个数字去按&#xff0c;最终按下…

如果有100万条消息堆积在MQ怎么解决

当 RabbitMQ 中有 100 万条消息堆积时&#xff0c;意味着消息处理速度已经明显落后于消息产生的速度。如果不及时解决&#xff0c;可能会导致系统负载过重、消息处理延迟加剧&#xff0c;甚至系统崩溃。为了解决这种大规模消息堆积问题&#xff0c;可以采取以下几种措施&#x…

如何在Matlab界面中添加日期选择器?

在Matlab界面中添加日期选择器&#xff0c;可以让用户通过图形界面方便地选择日期。Matlab提供了uidatepicker函数&#xff0c;允许用户在App Designer设计的GUI中添加日期选择器组件。以下是如何在Matlab界面中添加日期选择器的详细步骤&#xff1a; 1. 使用App Designer添加…