【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)
@Component
struct 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
@Component
struct 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()
}
}
复制代码
评论