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

HarmonyOS:基于hmrouter实现Page的生命周期监听

前言:在使用ArkTs语言写鸿蒙的App中,我们发现Page的生命周期函数,如下:

页面的生命周期(3+2)

onPageShow:页面显示触发(页面特有)

onPageHide:页面隐藏触发(页面特有)

onBackPress:当用户点击返回按钮时触发(页面特有)

aboutToAppear:组件即将出现时触发

aboutToDisappear:组件即将析构销毁时触发

组件的生命周期(2)

aboutToAppear:组件即将出现时触发

aboutToDisappear:组件即将析构销毁时触发

UIAbility组件生命周期函数

onCreate: UIAbility实例创建完成时触发

onForeground: 在UIAbility的UI可见之前

onBackground: 在UIAbility的UI完全不可见之后

onDestroy: 在UIAbility实例销毁时触发

WindowStage窗口生命周期函数

onWindowStageCreate 窗口才能构建

onWindowStageDestroy 窗口销毁

而我们的页面生命周期函数,aboutToAppear只会触发一次,如果我们的页面视图需要每次出现的时候都要刷新或者请求,就会发现没法触发生命周期函数,在ios的项目中有viewwillappare这个函数,这样就很好处理,但是鸿蒙中没有这样的生命周期函数。
我们的项目路由采用的是hmrouter框架,hmrouter的框架中的生命周期方法就比鸿蒙系统的方法就多了很多。hmrouter的具体用法,我就不在此详细介绍了,需要学习的可以去官网学习下用法。生命周期如下:

export abstract class AbstractLifecycle implements IHMLifecycle {observerMap: Map<HMLifecycleState, Array<(ctx: HMLifecycleContext) => HMLifecycleAction>> = new Map()onPrepare(ctx: HMLifecycleContext): HMLifecycleAction {return HMLifecycleAction.DO_NEXT()}onAppear(ctx: HMLifecycleContext): HMLifecycleAction {return HMLifecycleAction.DO_NEXT()}onDisAppear(ctx: HMLifecycleContext): HMLifecycleAction {return this.runObserver(HMLifecycleState.onDisAppear, ctx)}onShown(ctx: HMLifecycleContext): HMLifecycleAction {return this.runObserver(HMLifecycleState.onShown, ctx)}onHidden(ctx: HMLifecycleContext): HMLifecycleAction {return this.runObserver(HMLifecycleState.onHidden, ctx)}onWillAppear(ctx: HMLifecycleContext): HMLifecycleAction {return HMLifecycleAction.DO_NEXT()}onWillDisappear(ctx: HMLifecycleContext): HMLifecycleAction {return this.runObserver(HMLifecycleState.onWillDisappear, ctx)}onWillShow(ctx: HMLifecycleContext): HMLifecycleAction {return this.runObserver(HMLifecycleState.onWillShow, ctx)}onWillHide(ctx: HMLifecycleContext): HMLifecycleAction {return this.runObserver(HMLifecycleState.onWillHide, ctx)}onReady(ctx: HMLifecycleContext): HMLifecycleAction {return HMLifecycleAction.DO_NEXT()}onBackPressed(ctx: HMLifecycleContext): boolean {return this.runObserver(HMLifecycleState.onBackPressed, ctx).value}

hmrouter的生命周期监听方法太多了,完全够用了。具体用法如下:

export class PageDurationLifecycle extends AbstractLifecycle {private timeMap: Map<string, number> = new Map();onShown(ctx: HMLifecycleContext): HMLifecycleAction {const pageName = ctx.navContext?.pathInfo.name;let param =  ctx.navContext?.pathInfo.param as object;WinLog.info('PageDurationLifecycle onShown pageName:' + pageName)if (pageName) {this.timeMap.set(pageName, new Date().getTime())if (pageName=="LoginPage"){AppStorage.set<boolean>('loginOnPageShow', true);}}return HMLifecycleAction.DO_NEXT();}onHidden(ctx: HMLifecycleContext): HMLifecycleAction {const pageName = ctx.navContext?.pathInfo.nameWinLog.info('PageDurationLifecycle onHidden pageName:' + pageName)if (pageName && this.timeMap.has(pageName)) {const duration = new Date().getTime() - (this.timeMap.get(pageName) as number);this.timeMap.delete(pageName);WinLog.info(`Page ${pageName} stay ${duration} ms`);if (pageName=="LoginPage"){AppStorage.set<boolean>('loginOnPageShow', false);}}return HMLifecycleAction.DO_NEXT();}}

你通过日志观察就会发现,每当LoginPage出现的时候就会调用onShown方法,消失的时候就会调用onHidden方法,那我采用的是AppStorage存储页面的状态,通过监听loginOnPageShow的值来判断页面的生命周期

在LoginPage页面:

@StorageProp('loginOnPageShow') @Watch('onChangeVisibility') pageVisible: boolean = false;onChangeVisibility(){WinLog.debug("MVListAcvtPage 是否展示--->"+this.curPageVisibility)if (this.curPageVisibility) {this.getSubFuncBeanVisitAction()}}
```hmrouter
这样就通过hmrouter框架实现了Page的生命周期的监听,当然hmrouter框架还有很多生命周期方法,你都可以试试。

相关文章:

HarmonyOS:基于hmrouter实现Page的生命周期监听

前言&#xff1a;在使用ArkTs语言写鸿蒙的App中&#xff0c;我们发现Page的生命周期函数&#xff0c;如下&#xff1a; 页面的生命周期(32) onPageShow:页面显示触发(页面特有) onPageHide&#xff1a;页面隐藏触发(页面特有) onBackPress&#xff1a;当用户点击返回按钮时…...

DeepSeek + 飞书多维表格搭建你的高效工作流

众所周知&#xff0c;大模型DeepSeek擅长于处理大规模语言模型推理任务&#xff0c;特别是在成本降低和思维链推理方面表现出色‌&#xff0c;我们一般把大模型必做我们的大脑&#xff0c;但是一个人不能只有大脑&#xff0c;还需要其他输入输出以及操作支配的眼耳鼻嘴手足等。…...

uniapp+<script setup lang=“ts“>使用 uni.$emit和uni.$on全局传递数据

注意&#xff1a; 在A页面直接使用 uni.$emit(changeCategoryKey, childCategory)传递&#xff0c;在B页面使用 uni.$on(changeCategoryKey, (val) > {console.log(val, 取值);});只在组件传递有效&#xff0c;页面跳转后是无效的 跳转页面使用的传递数据的方法如下&…...

综合使用pandas、numpy、matplotlib、seaborn库做数据分析、挖掘、可视化项目

目录 1.结构化数据挖掘 1.1依赖库导入和数据读取 1.2各品牌机型及售价统计 1.3视频录制规格与价格关联性分析 2.结构化数据预处理 2.1筛选特征 2.2特征标签归一化及编码 1.结构化数据挖掘 1.1依赖库导入和数据读取 导入必要的依赖库&#xff0c;读取 csv 格式数据集转化为 Data…...

docker中kibana启动后,通过浏览器访问,出现server is not ready yet

问题&#xff1a;当我在浏览器访问kibana时&#xff0c;浏览器给我报了server is not ready yet. 在网上试了很多方法&#xff0c;都未能解决&#xff0c;下面是我的方法&#xff1a; 查看kibana日志&#xff1a; docker logs -f kibana从控制台打印的日志可以发现&#xff…...

十、Redis 主从复制:原理解析、配置实践与优化策略

Redis 主从复制:原理解析、配置实践与优化策略 Redis 作为高性能的 NoSQL 数据库,主从复制(Master-Slave Replication) 是其核心特性之一。主从复制用于数据冗余、读负载分担、故障恢复,是 Redis 构建高可用架构的基础。本文将深入解析 Redis 主从复制的配置方法、复制机…...

使用JMeter(组件详细介绍+使用方式及步骤)

JSON操作符 在我们使用请求时,经常会遇到JSON格式的请求体,所以在介绍组件之前我会将介绍部分操作符,在进行操作时是很重要的 Operator Description $ 表示根元素 当前元素 * 通配符,所有节点 .. 选择所有符合条件的节点 .name 子元素,name是子元素名称 [start:e…...

lamp平台的应用

一.lamp介绍 网站&#xff1a; 静态网站 动态网站 【php语言 .php结尾的文件】 作用&#xff1a;运行php语言编写的动态网站应用 lamp LinuxApache【负责解析静态资源】MySQL【负责存储网站产生的数据】PHP【负责解析动态资源】 如上图所示&#xff0c;是lamp平台中三…...

蓝桥杯4T平台(串口打印电压值)

知识点&#xff1a;串口(单片机发送数据)按键ADC 题目 配置 代码 adc.c uint16_t getadc2(void) {uint16_t adc0;HAL_ADC_Start(&hadc2);adcHAL_ADC_GetValue(&hadc2);return adc; } adc.h uint16_t getadc2(void); main.c #include "lcd.h" #include…...

使用ASIWebPageRequest库编写Objective-C下载器程序

使用 ASIWebPageRequest 库编写 Objective-C 下载器程序是一个简单且高效的方式来处理 HTTP 请求。在 ASIHTTPRequest 和 ASIWebPageRequest 中&#xff0c;ASIWebPageRequest 是专门用于下载网页及其资源的库。 1. 安装 ASIWebPageRequest 首先&#xff0c;你需要安装 ASIHT…...

代码随想录算法训练营 | 图论 | 孤岛总面积、沉没孤岛

101. 孤岛的总面积//思路大概是先计算面积&#xff0c;然后如果有接触路面就返回false。可能稍微多余算了太多无用面积。 #include<bits/stdc.h> using namespace std; void sum(vector<vector<bool>>& finded,const vector<vector<int>>&a…...

迷你世界脚本出生点接口:Spawnport

出生点接口&#xff1a;Spawnport 彼得兔 更新时间: 2023-04-26 10:19:56 具体函数名及描述如下: 序号 函数名 函数描述 1 getSpawnPoint(...) 获取默认出生点 2 setSpawnPoint(...) 设置出生点位置 3 getChunkValidSpawnPos(...) 获取区块有效刷新点…...

双链路提升网络传输的可靠性扩展可用带宽

为了提升网络传输的可靠性或增加网络可用带宽&#xff0c; 通常使用双链路冗余备份或者双链路聚合的方式。 本文介绍几种双链路网络通信的案例。 5GWiFi冗余传输 双Socket绑定不同网络接口&#xff1a;通过Android的ConnectivityManager绑定5G蜂窝网络和WiFi的Socket连接&…...

Pytest测试用例执行跳过的3种方式

文章目录 1.前言2.使用 pytest.mark.skip 标记无条件跳过3.使用 pytest.mark.skipif 标记根据条件跳过4. 执行pytest.skip()方法跳过测试用例 1.前言 在实际场景中&#xff0c;我们可能某条测试用例没写完&#xff0c;代码执行时会报错&#xff0c;或者是在一些条件下不让某些…...

【蓝桥杯】每天一题,理解逻辑(3/90)【Leetcode 快乐数】

闲话系列&#xff1a;每日一题&#xff0c;秃头有我&#xff0c;Hello&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;,我是IF‘Maxue&#xff0c;欢迎大佬们来参观我写的蓝桥杯系列&#xff0c;我好久没有更新博客了&#xff0c;因为up猪我寒假用自己的劳动换了…...

深度学习Save Best、Early Stop

一、Save Best 今天的大模型&#xff0c;在训练过程中可能会终止&#xff0c;但是模型其实是可以接着练的&#xff0c;假设GPU挂了&#xff0c;可以接着训练&#xff0c;在原有的权重上&#xff0c;训练其实就是更新w&#xff0c;如果前面对w进行了存档&#xff0c;那么可以从…...

数据库与存储优化

一、MySQL深度优化 索引优化 B树索引结构 结构特点&#xff1a; 平衡多路搜索树&#xff0c;所有数据存储在叶子节点&#xff0c;非叶子节点仅存键值和指针。叶子节点通过双向链表连接&#xff0c;支持范围查询高效遍历。 优势&#xff1a; 减少磁盘IO&#xff08;高扇出&#…...

Android15请求动态申请存储权限完整示例

效果: 1.修改AndroidManifest.xml增加如下内容: <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-perm...

C/C++蓝桥杯算法真题打卡(Day3)

一、P8598 [蓝桥杯 2013 省 AB] 错误票据 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_map<int, int> idCount; // 用于统计每个ID出现的次数vector<int> ids; …...

【数据结构与算法】Java描述:第二节:LinkedList 链表

一、链表的概念与结构 1.1 概念&#xff1a; 通俗的来说&#xff0c;链表是由一个个结点连接起来的就叫链表。 1.2 结构&#xff1a; 链表存储的数据 在 物理上是不一定连续的&#xff0c;它是由前面链接后面&#xff0c;一个个连起来的。 二、Java底层的 LinkedList 2.1…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾&#xff1a; 在上一篇《React入门第一步》中&#xff0c;我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目&#xff0c;并修改了App.jsx组件&#xff0c;让页面显示出我们想要的文字。但是&#xff0c;那个页面是“死”的&#xff0c;它只是静态…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...