一、引言

在鸿蒙(HarmonyOS)应用开发中,生命周期管理是构建稳定、高效应用的核心基础。它主要分为四个层次:UIAbility(应用/Ability)生命周期页面生命周期组件生命周期应用级生命周期监听。理解并合理运用这些生命周期回调,能够帮助开发者合理管理资源、提升应用性能并优化用户体验。

本教程将逐一详解这四个层次的生命周期方法,并配合完整的示例代码和调用顺序说明,帮助你快速掌握鸿蒙应用的生命周期管理。


二、UIAbility 生命周期

UIAbility 是鸿蒙应用的基本单元,相当于一个界面或服务入口。其生命周期包含以下主要回调,按执行顺序排列:

  • onCreateUIAbility 实例创建时触发。用于初始化全局数据、加载资源(如获取 context、定义变量)。
  • onWindowStageCreateWindowStage 创建后触发。这是加载页面内容(loadContent())和订阅窗口事件(如前后台切换、焦点变化)的最佳时机。
  • onForegroundUIAbility 切换至前台时且 UI 可见之前触发。可在此申请系统资源(如定位、传感器),或恢复后台释放的资源。
  • onBackgroundUIAbility 切换至后台、UI 完全不可见之后触发。适合释放无用资源、保存应用状态(如草稿数据)。
  • onWindowStageDestroyWindowStage 销毁时触发。用于释放 UI 相关资源(如临时文件、图形对象)。
  • onDestroyUIAbility 实例销毁时触发。用于清理全局资源、关闭网络连接、注销监听器等。

注意事项

  • 在 API 13+ 中,若用户通过最近任务一键清理应用,不会触发 onDestroy,而是直接终止进程。因此,关键数据的持久化应在 onBackground 中完成,而非依赖 onDestroy
  • onWindowStageCreate 中加载页面时,建议使用异步方式避免阻塞主线程。

三、页面生命周期

页面生命周期由 @Entry 装饰的自定义组件提供,主要包含三个回调:

  • onPageShow:页面每次显示时触发(包括第一次加载和从其他页面返回时)。适合刷新数据、恢复焦点等。
  • onPageHide:页面每次隐藏时触发一次(如跳转到其他页面)。适合暂停动画、释放临时资源。
  • onBackPress:用户点击系统返回键时触发。返回 true 可拦截默认返回行为,实现自定义返回逻辑(如弹窗确认)。

注意事项

  • onPageShow 与组件的 aboutToAppear 不同:返回页面时,不会重新执行 aboutToAppear,但会触发 onPageShow。因此,需要每次显示都执行的操作(如刷新列表)应放在 onPageShow
  • 页面跳转时,当前页面的 onPageHide 会在新页面的 onPageShow 之前执行。

四、组件生命周期

自定义组件(@Component 装饰)提供两个生命周期回调:

  • aboutToAppear:在组件的 build() 函数执行之前调用。适合进行数据初始化、资源加载、订阅事件等操作。
  • aboutToDisappear:在组件即将被销毁时调用。适合执行清理工作,如解除事件监听、释放定时器、取消网络请求等。

注意事项

  • 当使用 if/else 条件渲染时,条件从 true 变为 false 会导致组件销毁,触发 aboutToDisappear;条件重新变为 true 时会创建新组件,触发 aboutToAppear。框架会自动清理组件占用的内存和事件监听,但开发者仍需手动释放自定义资源(如 WebSocket 连接)。
  • 若希望在组件重新显示时保持之前的状态,可在 aboutToDisappear 中保存状态,并在 aboutToAppear 中恢复。

五、应用生命周期监听

除了上述层次,还可以通过 ApplicationContexton('applicationStateChange') 方法监听应用整体的前后台切换:

  • onApplicationForeground:应用从后台切换到前台时回调。
  • onApplicationBackground:应用从前台切换到后台时回调。

注意事项

该监听适用于全局统计或资源管理(如降低后台网络请求频率),但需注意回调为异步,无严格时序保证。


六、生命周期总结

层次 关键方法 典型用途
UIAbility onCreate / onForeground / onBackground / onDestroy 全局初始化、资源申请与释放、状态保存
页面 onPageShow / onPageHide / onBackPress 页面级数据刷新、返回拦截
组件 aboutToAppear / aboutToDisappear 组件级初始化与清理
应用 applicationStateChange 全局前后台监听

合理利用这些生命周期,可以避免内存泄漏、提升启动速度,并确保用户数据不丢失。


七、示例代码

7.1 UIAbility 生命周期(EntryAbility.ets)

import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, 'LifecycleDemo', 'UIAbility onCreate');
    // 初始化全局数据,如数据库连接、全局变量
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    hilog.info(0x0000, 'LifecycleDemo', 'UIAbility onWindowStageCreate');
    // 加载页面内容
    windowStage.loadContent('pages/Index', (err) => {
      if (err && err.code) {
        hilog.error(0x0000, 'LifecycleDemo', 'Failed to load content, code: %{public}s', String(err.code));
        return;
      }
      hilog.info(0x0000, 'LifecycleDemo', 'Page loaded');
    });
  }

  onForeground(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'UIAbility onForeground');
    // 申请系统资源,如定位、传感器
  }

  onBackground(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'UIAbility onBackground');
    // 保存关键数据(如草稿、用户状态),因为 onDestroy 可能不被调用
  }

  onWindowStageDestroy(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'UIAbility onWindowStageDestroy');
    // 释放 UI 相关资源,如临时文件、图形对象
  }

  onDestroy(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'UIAbility onDestroy');
    // 清理全局资源,关闭网络连接,注销监听器
  }
}

7.2 页面生命周期(Index.ets)

import { router } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';

@Entry
@Component
struct Index {
  aboutToAppear(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'Component aboutToAppear');
    // 初始化组件数据,订阅事件
  }

  onPageShow(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'Page onPageShow');
    // 每次页面显示时刷新数据(如从其他页面返回时)
  }

  onPageHide(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'Page onPageHide');
    // 页面隐藏时暂停动画、释放临时资源
  }

  onBackPress(): boolean {
    hilog.info(0x0000, 'LifecycleDemo', 'Page onBackPress');
    // 返回 true 可拦截默认返回行为
    // 例如:弹窗确认是否退出
    return false; // 返回 false 执行默认返回
  }

  aboutToDisappear(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'Component aboutToDisappear');
    // 组件销毁时清理资源,如取消定时器、解除事件监听
  }

  build() {
    Column({space: 20}) {
      MyComponent()
      Button('下一个页面')
        .width('80%')
        .fontSize(20)
        .onClick(() => {
          router.pushUrl({ url: 'pages/SecondPage' });
        })
    }
    .width('100%')
    .height('100%')
  }
}

@Component
struct MyComponent {
  @State count: number = 0;

  aboutToAppear(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'MyComponent aboutToAppear');
    // 初始化子组件数据
  }

  build() {
    Text(`Count: ${this.count}`)
      .fontSize(20)
      .onClick(() => {
        this.count++;
      })
  }

  aboutToDisappear(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'MyComponent aboutToDisappear');
    // 清理子组件资源,如释放定时器
  }
}

7.3 子组件生命周期(MyComponent.ets)

import { hilog } from '@kit.PerformanceAnalysisKit';

@Component
struct MyComponent {
  @State count: number = 0;

  aboutToAppear(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'MyComponent aboutToAppear');
    // 初始化子组件数据
  }

  build() {
    Text(`Count: ${this.count}`)
      .fontSize(20)
      .onClick(() => {
        this.count++;
      })
  }

  aboutToDisappear(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'MyComponent aboutToDisappear');
    // 清理子组件资源,如释放定时器
  }
}

7.4 第二个页面生命周期(SecondPage)

import { hilog } from '@kit.PerformanceAnalysisKit';
import { router } from '@kit.ArkUI';

@Entry
@Component
struct SecondPage {
  aboutToAppear(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'SecondPage Component aboutToAppear');
    // 初始化组件数据,订阅事件
  }

  onPageShow(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'SecondPage onPageShow');
    // 每次页面显示时刷新数据(如从其他页面返回时)
  }

  onPageHide(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'SecondPage onPageHide');
    // 页面隐藏时暂停动画、释放临时资源
  }

  onBackPress(): boolean {
    hilog.info(0x0000, 'LifecycleDemo', 'SecondPage onBackPress');
    // 返回 true 可拦截默认返回行为
    // 例如:弹窗确认是否退出
    return false; // 返回 false 执行默认返回
  }

  aboutToDisappear(): void {
    hilog.info(0x0000, 'LifecycleDemo', 'SecondPage Component aboutToDisappear');
    // 组件销毁时清理资源,如取消定时器、解除事件监听
  }

  build() {
    Column() {
      Text('第二个页面')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
      Button('返回').onClick(() => {
        router.back()
      })
    }
    .width('100%')
    .height('100%')
  }
}

八、执行顺序说明

8.1 应用启动时(首次打开应用)

  1. UIAbility onCreate
  2. UIAbility onWindowStageCreate
  3. UIAbility onForeground
  4. Component aboutToAppear(Index 页面组件)
  5. MyComponent aboutToAppear(子组件)
  6. Page onPageShow(Index 页面)

运行效果:

在这里插入图片描述

说明onForeground 在 UI 可见之前触发(用于申请系统资源),随后页面显示时触发 onPageShow(用于刷新页面数据)。

8.2 应用切换到后台(按 Home 键或切换应用)

  1. UIAbility onBackground
  2. Page onPageHide(当前页面)

运行效果:

在这里插入图片描述

说明:页面先隐藏(onPageHide),UI 完全不可见后触发 onBackground。关键数据持久化应在 onBackground 中完成。

8.3 应用从后台回到前台

  1. Page onPageShow(当前页面)
  2. UIAbility onForeground

运行效果:

在这里插入图片描述

说明onForeground 触发时 UI 尚未完全可见,随后页面重新显示触发 onPageShow。返回前台时不会重新执行 aboutToAppear

8.4 页面跳转(从 Index 跳转到 Second)

  1. Page onPageHide(Index 页面)
  2. Page onPageShow(Second 页面)

运行效果:

在这里插入图片描述

说明:Index 页面的组件不会销毁,因此 aboutToDisappear 不会触发。

8.5 页面返回(从 Second 返回 Index)

  1. Page onPageHide(Second 页面)
  2. Page onPageShow(Index 页面)

运行效果:

在这里插入图片描述

说明:Index 页面的 aboutToAppear 不会再次执行,但 onPageShow 会触发,适合刷新数据。

8.6 应用退出(用户关闭应用或系统回收)

  1. Page onPageHide(当前页面)
  2. Component aboutToDisappear(当前页面组件)
  3. MyComponent aboutToDisappear(子组件)
  4. UIAbility onWindowStageDestroy
  5. UIAbility onDestroy

运行效果:

在这里插入图片描述

注意:如果用户通过最近任务一键清理应用,可能只触发 onBackgroundonWindowStageDestroy,而 onDestroy 可能不被调用。因此,关键数据持久化必须onBackground 中完成。


九、关键注意事项

生命周期 注意事项
onBackground 必须在此保存用户数据(如草稿、表单输入),因为 onDestroy 可能不被调用
onPageShow 适合刷新列表、恢复焦点,因为返回页面时不会重新执行 aboutToAppear
aboutToDisappear 必须手动清理定时器、事件监听、网络请求,避免内存泄漏
onBackPress 返回 true 可拦截返回键,实现自定义逻辑(如弹窗确认)
条件渲染 使用 if/else 时,条件变化会导致组件销毁和重建,aboutToAppearaboutToDisappear 会相应触发

核心原则:资源分配与释放要成对出现,状态保存要选择可靠的回调时机(onBackground 而非 onDestroy)。

通过上述示例和顺序说明,你可以清晰地看到鸿蒙应用开发中各个生命周期方法的调用时机和相互关系。在实际开发中,合理利用这些生命周期,可以有效管理资源、提升性能并确保数据安全。

Logo

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

更多推荐