1. 理解鸿蒙应用的生命周期层级

在鸿蒙应用开发中,生命周期管理是应用流畅运行和用户体验的基石。鸿蒙系统的生命周期呈现多层次结构,涵盖从应用启动到销毁的完整流程。

各层级生命周期概览

层级 核心作用 典型场景
App进程级 管理应用进程的创建与销毁 进程启动时加载必要模块,销毁前清理缓存
Application级 应用全局上下文的生命周期,管理所有Ability共享的资源 初始化全局服务(如网络请求拦截器、加密工具)
Ability级 应用功能单元的生命周期 UIAbility组件包含UI,主要用于和用户交互;ExtensionAbility组件提供特定场景的扩展能力
页面级(@Entry) @Entry装饰的组件生命周期,页面级UI展示与交互状态管理 页面显示时刷新数据,隐藏时保存未完成表单
组件级(@Component) 自定义组件的生命周期,独立UI单元的渲染与资源释放 组件销毁时取消实时数据订阅

2. Application 生命周期

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

核心回调方法

  • onCreate():应用首次启动时触发,用于初始化全局服务(如网络请求拦截器、加密工具)。

  • onDestroy():应用进程销毁时触发,用于清理全局资源(如关闭数据库连接、注销推送服务)。

  • onConfigurationUpdated(config):系统配置变化时触发(如屏幕旋转),用于适配横竖屏布局。

  • onTrimMemory(level):系统内存不足时触发(level表示紧急程度),用于释放非必要资源。

3. Ability/UIAbility 生命周期

Ability是应用的功能单元(如“首页”“交易”均可为独立Ability)。在Stage模型中,UIAbility组件是目前主推的,用于构建用户界面的基本组件。

UIAbility生命周期回调(Stage模型)

其生命周期围绕窗口舞台(WindowStage)的创建与销毁。

  • onCreate(want, launchParam):Ability首次创建时调用,用于初始化Ability级资源(如用户Token存储)。

  • onWindowStageCreate(windowStage):窗口舞台创建时调用,用于加载页面UI、设置窗口属性(如禁止截屏)。

  • onWindowStageActive():窗口获得焦点时调用(如用户切回应用),用于恢复Ability交互。

  • onWindowStageInactive():窗口失去焦点时调用(如用户切到其他应用),用于暂停Ability交互。

  • onWindowStageDestroy():窗口舞台销毁时调用,用于释放窗口资源。

  • onDestroy():Ability销毁时调用,用于清理Ability级数据。

注意:Stage模型与FA模型的最大区别在于,Stage模型中多个应用组件共享同一个ArkTS引擎实例,这使得应用组件之间可以更方便地共享对象和状态,同时减少了复杂应用运行对内存的占用。

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

页面是被@Entry装饰的特殊组件,继承组件生命周期的同时,新增了页面级交互相关的函数。

页面级核心回调

  • onPageShow():页面切换至前台时触发(如从后台切回),适合刷新实时数据、验证用户会话。

  • onPageHide():页面切换至后台时触发(如跳转至其他页面),适合暂停页面动态效果、保存未提交数据。

  • onBackPress():用户点击返回按钮(物理或虚拟)时触发,可拦截返回事件(例如提示用户“有未完成操作,确认离开?”)。

  • onWindowStageShow():页面所在窗口显示时触发,适合恢复窗口级交互(如启用手势密码输入)。

  • onWindowStageHide():页面所在窗口隐藏时触发,适合禁用窗口级交互(如暂停指纹识别监听)。

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

自定义组件是UI的最小单元,其生命周期聚焦于“渲染-交互-销毁”的完整流程。

组件生命周期回调

  • build():组件首次渲染或状态(如@State)更新时调用,用于构建UI结构。注意:此函数内不可执行耗时操作。

  • onDidBuild()build执行完毕后调用,可用于数据初始化或额外的UI调整。

  • onReady():组件挂载到渲染树后调用,此时可获取DOM信息,适合启动组件内动画。

  • onWillDestroy():组件即将从渲染树移除前调用(HarmonyOS 5.1+新增),适合取消组件内定时器、解绑事件监听。

  • onDestroy():组件完全销毁时调用,用于释放组件占用的系统资源(如图片缓存)。

6. 生命周期调用顺序(完整流程示例)

以应用启动一个首页为例,各生命周期触发顺序如下:

  1. App进程启动

  2. Application.onCreate() – 初始化全局服务(如加密服务)

  3. Ability.onCreate() – 加载Ability级资源(如用户Token)

  4. Ability.onWindowStageCreate() – 创建窗口舞台,加载首页UI

  5. Ability.onWindowStageActive() – 窗口获得焦点

  6. 页面build() – 构建页面布局

  7. 页面onDidBuild() – 页面布局构建完成后,初始化页面数据

  8. 页面onWindowStageShow() – 窗口显示

  9. 页面onReady() – 页面准备就绪,可执行初始化完成后的操作

  10. 页面onPageShow() – 页面显示,刷新用户数据

7. 代码示例:生命周期实战

以下是一个简单的首页页面(@Entry)和自定义行情卡片组件(@Component)的生命周期代码示例:

// 自定义组件:行情卡片(@Component)
@Component
struct MarketCard {
  @State price: number = 0
  private timerId: number = -1

  // 构建UI
  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)
  }

  // 组件销毁前清理定时器
  onWillDestroy() {
    console.log('行情卡片:即将销毁,准备清理资源')
  }

  // 组件销毁时停止刷新
  onDestroy() {
    console.log('行情卡片:销毁,停止价格监听')
    if (this.timerId !== -1) {
      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(() => {
          // 处理页面跳转...
        })
    }
    .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 // 实际场景:根据本地缓存判断
  }
}

8. 生命周期管理最佳实践与优化策略

  1. 资源的精准加载与释放

    • onReadyonPageShow中加载必要资源。

    • onDestroyonPageHide中及时释放资源,避免内存泄漏。例如,在组件onWillDestroyonDestroy中清除定时器、解绑事件。

  2. 状态保存与恢复

    • onPageHide或Ability的onBackground时保存当前页面状态(如表单数据、滚动位置)。

    • onPageShow或Ability的onForeground时恢复状态,提升用户体验。

  3. 避免耗时操作

    • build()函数中避免执行耗时任务,以防阻塞UI渲染。

    • 耗时操作(如网络请求、复杂计算)建议在异步任务中执行。

  4. 合理使用状态管理

    • 正确使用@State@Link@Prop等装饰器,它们的变化会触发build()更新,需注意性能优化。

总结

深入理解并妥善管理鸿蒙应用的各级生命周期,是构建高性能、高用户体验应用的关键。通过精准地在不同生命周期回调中执行初始化、资源释放、状态保存与恢复等操作,可以确保应用运行流畅且高效。希望本文能帮助你在鸿蒙应用开发的道路上走得更加顺畅。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐