写点什么

【HarmonyOS 5】鸿蒙页面和组件生命周期函数

作者:GeorgeGcs
  • 2025-07-22
    上海
  • 本文字数:3000 字

    阅读完需:约 10 分钟

【HarmonyOS 5】鸿蒙页面和组件生命周期函数

在 HarmonyOS Next 5.1 及以上版本中,生命周期体系呈现多层次结构,涵盖从应用启动到销毁的完整流程,各层级生命周期既独立又相互关联:App 级:应用进程的创建与销毁 Application 级:应用全局上下文的生命周期 Ability 级:应用功能单元的生命周期页面级:被 @Entry 装饰的组件生命周期组件级:自定义组件的生命周期

一、生命周期体系总览

二、各层级生命周期详解

1. 组件生命周期(@Component)

自定义组件是 UI 的最小单元,生命周期聚焦于“渲染-交互-销毁”的完整流程,5.1+版本新增onWillDestroy回调,强化资源清理能力。


2. 页面生命周期(@Entry)

页面是被@Entry装饰的特殊组件,继承组件生命周期的同时,新增页面级交互相关函数,是用户视觉感知的直接载体。


3. Ability 生命周期(Stage 模型)

Ability 是应用的功能单元(如“首页”“交易”均为独立 Ability),其生命周期围绕窗口舞台(WindowStage)的创建与销毁,是 UI 展示的载体。


4. Application 生命周期

Application 是应用全局上下文,管理所有 Ability 共享的资源,生命周期贯穿应用从启动到销毁的全流程。


5. App 进程生命周期

App 进程是应用运行的载体,其生命周期与系统进程管理强相关,是所有层级生命周期的基础。


三、生命周期调用顺序(完整流程)

以金融类应用“启动首页”为例,各生命周期触发顺序如下:


App进程启动 → Application.onCreate()(初始化加密服务)→ Ability.onCreate()(加载用户Token)→ Ability.onWindowStageCreate()(加载首页UI)→ Ability.onWindowStageActive()(窗口获焦)→ 页面build()(绘制首页布局)→ 页面onDidBuild()(初始化行情数据)→ 页面onWindowStageShow()(窗口显示)→ 页面onReady()(绑定实时行情监听器)→ 页面onPageShow()(刷新用户资产)
复制代码

四、代码示例(5.1+版本,金融场景适配)

1. 组件与页面生命周期(行情卡片组件+首页页面)

// 自定义组件:行情卡片(@Component)@Componentstruct MarketCard {  @State price: number = 0  private timerId: number = -1
build() { Column() { Text(`实时金价:${this.price.toFixed(2)}元/g`) .fontSize(16) .padding(10) } .backgroundColor('#f5f5f5') .borderRadius(8) }
// 组件挂载后启动行情刷新 onReady() { console.log('行情卡片:开始监听实时价格') this.timerId = setInterval(() => { this.price += Math.random() * 2 - 1 // 模拟价格波动 }, 3000) }
// 组件销毁前清理定时器(5.1+新增) onWillDestroy() { console.log('行情卡片:即将销毁,准备清理资源') }
// 组件销毁时停止刷新 onDestroy() { console.log('行情卡片:销毁,停止价格监听') clearInterval(this.timerId) // 金融场景:必须清理定时器,避免内存泄漏 }}
// 页面:首页(@Entry)@Entry@Componentstruct HomePage { @State userBalance: number = 0
build() { Column({ space: 20 }) { Text('我的资产') .fontSize(20) .fontWeight(FontWeight.Bold) Text(`总资产:${this.userBalance.toFixed(2)}元`) .fontSize(18) MarketCard() // 引入行情卡片组件 Button('去交易') .onClick(() => router.pushUrl({ url: 'pages/TradePage' })) } .width('100%') .padding(16) }
// 页面显示时刷新资产(金融场景:敏感数据实时更新) onPageShow() { console.log('首页显示:刷新用户资产') this.fetchUserBalance() // 调用接口获取最新资产 }
// 页面隐藏时保存未完成操作 onPageHide() { console.log('首页隐藏:保存浏览记录') this.saveBrowseHistory() }
// 处理返回按钮(拦截退出,提示确认) onBackPress(): boolean { console.log('首页返回:检查是否有未提交订单') if (this.hasUnfinishedOrder()) { // 金融场景:未完成订单时拦截返回 promptAction.showToast({ message: '有未完成订单,确认离开?' }) return true // 拦截系统默认返回 } return false }
// 模拟资产获取 private fetchUserBalance() { // 实际场景:调用加密接口获取数据 this.userBalance = 50000 + Math.random() * 10000 }
// 模拟保存浏览记录 private saveBrowseHistory() { // 实际场景:存入本地数据库(需加密) }
// 模拟检查未完成订单 private hasUnfinishedOrder(): boolean { return false // 实际场景:根据本地缓存判断 }}
复制代码

2. Ability 生命周期(首页 Ability)

// EntryAbility.ts(首页Ability)import UIAbility from '@ohos.app.ability.UIAbility'import window from '@ohos.window'import { EncryptUtil } from '../common/EncryptUtil' // 金融场景:加密工具类
export default class HomeAbility extends UIAbility { onCreate(want, launchParam) { console.log('首页Ability:初始化,加载用户Token') // 金融场景:解密并加载本地存储的用户Token EncryptUtil.init() }
// 创建窗口舞台,加载首页页面 onWindowStageCreate(windowStage: window.WindowStage) { console.log('首页Ability:创建窗口舞台') // 金融场景:设置窗口不可截屏(保护资产信息) windowStage.getMainWindow((err, mainWindow) => { mainWindow.setWindowSecure(true) }) // 加载首页页面 windowStage.loadContent('pages/HomePage', (err, data) => {}) }
// 窗口获焦时启用交互 onWindowStageActive() { console.log('首页Ability:窗口获焦,启用按钮点击') }
// 窗口失焦时暂停交互 onWindowStageInactive() { console.log('首页Ability:窗口失焦,禁用交互') }
// 窗口销毁时清理资源 onWindowStageDestroy() { console.log('首页Ability:窗口销毁,清理加密工具') EncryptUtil.destroy() }
onDestroy() { console.log('首页Ability:销毁,清理Token') // 金融场景:清除内存中的敏感数据 }}
复制代码

3. Application 生命周期(全局配置)

// app.ets(Application)import AbilityStage from '@ohos.app.ability.AbilityStage';import { CrashReporter } from '../common/CrashReporter' // 金融场景:崩溃监控
export default class MyApplication extends AbilityStage { onCreate() { console.log('Application:应用启动,初始化全局服务') // 金融场景:初始化崩溃监控(记录异常交易) CrashReporter.init() }
// 系统配置变化(如屏幕旋转) onConfigurationUpdated(config) { console.log('Application:配置变化,适配布局') }
// 内存不足时释放非核心资源 onTrimMemory(level) { console.log(`Application:内存不足(等级${level}),清理行情缓存`) // 金融场景:保留交易相关缓存,清除历史行情缓存 }
onDestroy() { console.log('Application:应用销毁,清理全局资源') // 金融场景:关闭数据库连接,清除内存中敏感数据 CrashReporter.destroy() }}
复制代码


发布于: 刚刚阅读数: 2
用户头像

GeorgeGcs

关注

路漫漫其修远兮,吾将上下而求索。 2024-12-24 加入

鸿蒙创作先锋,华为HDE专家,鸿蒙讲师,作者。 目前任职鸿蒙应用架构师。历经腾讯,宝马,研究所,金融。 待过私企,外企,央企。 深耕大应用开发领域十年。 OpenHarmony,HarmonyOS,Flutter,H5,Android,IOS。

评论

发布
暂无评论
【HarmonyOS 5】鸿蒙页面和组件生命周期函数_GeorgeGcs_InfoQ写作社区