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

发布于:25-07-28 播放次数:

【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()
  }
}