【HarmonyOS 5】鸿蒙页面和组件生命周期函数
鸿蒙系统开发实力显著,HarmonyOS SDK应用服务广泛,尤其在金融领域,金融理财类应用表现突出。
HarmonyOS Next 5.1 及其后续版本中,生命周期架构展现出多级层次,它囊括了从应用启动直至终止的整个运行过程,各个层级的生活周期功能既保持独立性,又彼此紧密相连。
App 级:应用进程的创建与销毁
Application 级:应用全局上下文的生命周期
Ability 级:应用功能单元的生命周期
页面级:被 @Entry 装饰的组件生命周期
组件级:自定义组件的生命周期
一、生命周期体系总览
层级
核心作用
典型场景(金融类应用)
App进程
管理应用进程的创建与销毁
进程启动时加载加密模块,销毁前清理敏感缓存
Application
全局资源初始化与配置管理
初始化全局加密服务、注册崩溃监控
Ability
功能单元的窗口与生命周期管理
金融首页Ability加载用户资产数据
页面(@Entry)
页面级UI展示与交互状态管理
转账页面显示时刷新余额,隐藏时保存未完成表单
组件(@Component)
独立UI单元的渲染与资源释放
行情组件销毁时取消实时数据订阅
二、对各个阶段的生命周期进行详细阐述,首先,我们来探讨组件的生命周期(标记为@Component)。
自定义组件构成用户界面的基础元素,其生命周期主要围绕“渲染、交互、销毁”这一整个流程展开,而在5.1及以上版本中,新增了onWillDestroy的回调机制,从而增强了资源管理的效率。
生命周期函数
触发时机
金融场景应用
build()
组件首次渲染或状态(@State)更新时
构建UI结构(如行情卡片、交易按钮),不可执行耗时操作
onDidBuild()
build执行完毕后
初始化组件私有数据(如计算卡片尺寸适配布局)
onReady()
组件挂载到渲染树(可获取DOM信息)
启动组件内动画(如金额数字滚动效果)
onWillDestroy()
组件即将从渲染树移除前(5.1+新增)
取消组件内定时器(如倒计时器)、解绑事件监听
onDestroy()
组件完全销毁时
释放组件占用的系统资源(如图片缓存、临时变量)
2. 页面生命周期(@Entry)
页面作为被@Entry所装饰的特定组件,不仅继承了组件的生命周期开yun体育app官网网页登录入口,还额外引入了与页面交互相关的功能,它直接承载了用户的视觉体验。
生命周期函数
触发时机
金融场景应用
(继承组件生命周期)
同组件生命周期,新增页面专属逻辑
onPageShow()
页面切换至前台(如从后台切回)
刷新实时行情数据、验证用户会话有效性
onPageHide()
页面切换至后台(如跳转至其他页面)
暂停行情推送、保存未提交的交易表单
onBackPress()
用户点击返回按钮(物理/虚拟)
拦截返回(如提示“交易未完成,是否离开?”)
onWindowStageShow()
页面所在窗口显示时
恢复窗口级交互(如启用手势密码输入)
onWindowStageHide()
页面所在窗口隐藏时
禁用窗口级交互(如暂停指纹识别监听)
3. Ability生命周期(Stage模型)
Ability代表的是独立的功能模块(例如“首页”、“交易”等均属独立模块),其存在与运作过程紧密关联于窗口舞台(WindowStage)的生成与终止,充当着用户界面展示的核心媒介。
生命周期函数
触发时机
金融场景应用
onCreate(want, launchParam)
Ability首次创建时
初始化Ability级资源(如用户Token存储)
执行onWindowStageCreate函数云开·全站体育app登录,针对窗口阶段创建事件。
窗口舞台创建时
加载页面(如加载交易页面UI)、设置窗口属性(如禁止截屏)
onWindowStageActive()
窗口获得焦点时(如用户切回)
恢复Ability交互(如启用按钮点击事件)
onWindowStageInactive()
窗口失去焦点时(如用户切走)
暂停Ability交互(如禁用输入框编辑)
onWindowStageDestroy()
窗口舞台销毁时
释放窗口资源(如销毁自定义弹窗)
onDestroy()
Ability销毁时
清理Ability级数据(如移除临时交易缓存)
4. Application生命周期
Application作为应用的全局上下文,负责管理所有Ability共用的资源,其生命周期覆盖了从应用启动至销毁的整个流程。
生命周期函数
触发时机
金融场景应用
onCreate()
应用首次启动时
初始化全局服务(如网络请求拦截器、加密工具)
onDestroy()
应用进程销毁时
清理全局资源(如关闭数据库连接、注销推送服务)
在配置信息更新后,对config进行操作。
系统配置变化时(如屏幕旋转)
适配横竖屏布局(如行情图表旋转后重绘)
onTrimMemory(level)
系统内存不足时(level表示紧急程度)
释放非必要资源(如清除非核心行情缓存)
5. App进程生命周期
应用进程充当了运行应用的媒介,它与系统的进程管理紧密相连kaiyun全站网页版登录,构成了所有层级生命周期的基础。
状态
触发时机
与其他生命周期的关联
启动
用户点击图标/被其他应用唤醒
当Application的onCreate方法被调用时,紧随其后的是Ability的onCreate方法被激活。
运行
至少一个Ability处于活跃状态
各层级生命周期正常响应(如页面切换、交互)
终止
用户退出/系统回收内存
调用Ability的onDestroy方法,进而导致Application的onDestroy方法被激活。
三、生命周期调用顺序(完整流程)
以金融类应用“启动首页”为例,各生命周期触发顺序如下:
应用程序启动时,将触发Application的onCreate方法,进而初始化加密服务。
在Ability的onCreate方法中,执行加载用户Token的操作。
执行Ability.onWindowStageCreate()函数,旨在加载首页的用户界面。
检测窗口是否处于激活状态,执行Ability.onWindowStageActive()函数。
→ 页面build()(绘制首页布局)
→ 页面onDidBuild()(初始化行情数据)
→ 页面onWindowStageShow()(窗口显示)
→ 页面onReady()(绑定实时行情监听器)
→ 页面onPageShow()(刷新用户资产)
四、代码示例(适用于5.1及以上版本,针对金融场景进行优化)——1. 针对行情卡片组件和首页页面,详细阐述了组件与页面之间的生命周期关系。
// 自定义组件:行情卡片(@Component)
@Component
struct MarketCard {
@State price: number = 0
private timerId: number = -1
build() {
Column() {
实时金价信息显示,当前价格是${this.price.toFixed(2)}元每克。
.fontSize(16)
.padding(10)
}
设置背景颜色为#f5f5f5。
.borderRadius(8)
}
// 组件挂载后启动行情刷新
onReady() {
控制台输出:“行情信息卡片启动,现在正在跟踪实时价格变动。”
本对象的计时器ID被设置为通过一个函数,该函数每过一定时间间隔就会执行一次。
此行代码中,价格变量增加了一个随机值,该值介于-1与1之间,通过乘以2再减去1的方式,以模拟价格波动的效果。
}, 3000)
}
// 组件销毁前清理定时器(5.1+新增)
onWillDestroy() {
控制台输出信息显示:“本行情卡片即将被销毁,同时正在进行资源的整理与回收工作。”
}
// 组件销毁时停止刷新
onDestroy() {
控制台输出:“行情信息卡片已被销毁,同时已终止对价格变化的监控。”
清除定时器ID,确保在金融场景中防止内存泄露的发生。
}
}
// 页面:首页(@Entry)
@Entry
@Component
struct HomePage {
在State对象中,用户余额的数值被设定为0。
build() {
Column({ space: 20 }) {
Text('我的资产')
.fontSize(20)
.fontWeight(FontWeight.Bold)
文本显示(总资产为:${this.userBalance}元,精确到小数点后两位)。
.fontSize(18)
MarketCard() // 引入行情卡片组件
Button('去交易')
点击事件触发时,将执行一个函数,该函数负责将路由器导向“pages/TradePage”页面。
}
.width('100%')
.padding(16)
}
// 页面显示时刷新资产(金融场景:敏感数据实时更新)
onPageShow() {
控制台输出信息:显示“首页内容:更新用户资产状况”
执行 this.fetchUserBalance() 方法,以获取用户资产的最新数据。
}
// 页面隐藏时保存未完成操作
onPageHide() {
控制台输出:“首页已隐藏,功能包括保存用户浏览记录”
this.saveBrowseHistory()
}
// 处理返回按钮(拦截退出,提示确认)
onBackPress(): boolean {
在控制台输出信息:“请确认首页是否返回,并检查是否存在尚未提交的订单。”
若此对象存在未完成的订单,{
// 金融场景:未完成订单时拦截返回
promptAction执行显示提示框操作,提示信息为:“存在未完成的订单,您确定要离开吗?”
return true // 拦截系统默认返回
}
return false
}
// 模拟资产获取
private fetchUserBalance() {
// 实际场景:调用加密接口获取数据
当前用户的余额设定为50000元,并在此基础上随机增加一个介于0到10000元之间的数值。
}
// 模拟保存浏览记录
private saveBrowseHistory() {
// 实际场景:存入本地数据库(需加密)
}
// 模拟检查未完成订单
此函数名为hasUnfinishedOrder,用于判断是否存在未完成的订单,并返回一个布尔值结果。
return false // 实际场景:根据本地缓存判断
}
}
2. Ability生命周期(首页Ability)
// EntryAbility.ts(首页Ability)
引入UIAbility模块自“@ohos.app.ability”路径。
引入window模块自“@ohos.window”路径。
引入了名为EncryptUtil的加密工具类,该类位于“../common”目录下,适用于金融场景使用。
onCreate(want, launchParam) {
控制台输出:“首页功能:进行初始化操作,并加载用户身份验证令牌”
// 金融场景:解密并加载本地存储的用户Token
EncryptUtil.init()
}
// 创建窗口舞台,加载首页页面
在创建窗口阶段时,执行函数调用,参数为指定的窗口阶段对象(windowStage: window.WindowStage)。
console.log("在首页中,展示Ability的功能:构建窗口舞台界面")。
// 金融场景:设置窗口不可截屏(保护资产信息)
获取主窗口信息时,windowStage调用getMainWindow方法,该操作将回调一个函数,该函数接收两个参数:错误信息(err)和主窗口对象(mainWindow),其中错误信息用于判断操作是否成功,主窗口对象则用于后续操作。
主窗口设置安全属性为开启状态。
})
// 加载首页页面
windowStage执行加载内容操作,目标为'pages/HomePage',随后通过回调函数处理可能出现的错误和获取的数据。
}
// 窗口获焦时启用交互
onWindowStageActive() {
控制台输出:“在首页中,当窗口获得焦点时,将激活按钮的点击功能。”
}
// 窗口失焦时暂停交互
onWindowStageInactive() {
在控制台输出信息:“首页功能:当窗口失去焦点时,停止用户交互”
}
// 窗口销毁时清理资源
onWindowStageDestroy() {
console.log("在首页的Ability模块中,执行了窗口的销毁操作,并对加密工具进行了清理处理。")
EncryptUtil.destroy()
}
onDestroy() {
在控制台输出信息:“首页功能:执行销毁操作,清除Token数据”
// 金融场景:清除内存中的敏感数据
}
}
3. Application生命周期(全局配置)
// app.ets(Application)
引入模块 AbilityStage,该模块来源于 '@ohos.app.ability' 路径下的 AbilityStage 部分。
引入了名为CrashReporter的模块,该模块位于“../common/CrashReporter”路径下,用于金融场景中的崩溃监控处理。
将默认导出定义为一个名为MyApplication的类,该类继承自AbilityStage。
onCreate() {
console.log("应用已启动,正在进行全局服务的初始化处理。")
// 金融场景:初始化崩溃监控(记录异常交易)
CrashReporter.init()
}
// 系统配置变化(如屏幕旋转)
当配置信息更新时,执行函数config,对配置进行相应的处理。
控制台输出:“应用配置调整,进行界面适配”
}
// 内存不足时释放非核心资源
onTrimMemory(level) {
控制台输出:该应用因内存容量短缺(达到${level}级),需进行行情缓存清除操作。
// 金融场景:保留交易相关缓存,清除历史行情缓存
}
onDestroy() {
console.log("当前应用已终止,正在对全局资源进行整理和释放。")
// 金融场景:关闭数据库连接,清除内存中敏感数据
CrashReporter.destroy()
}
}

