HarmonyOS笔记12:生命周期

谈及HarmonyOS Next中的生命周期有几种情况:(1)应用进程的生命周期;(2)UIAbility和UI组件的生命周期;(3)页面和自定义组件的生命周期。

一、应用进程的生命周期

应用进程的生命周期是操作系统层面,管理应用进程的创建、驻留和销毁。在应用进程生命周期中,包含一下几个环节:

  • 前台:应用有可见的UI界面。
  • 后台:应用界面不可见,但进程仍保留在内存中,可以执行受限的后台任务。
  • 挂起:应用进程处于"冻结"状态,暂停执行,但保留内存数据,以便快速恢复。
  • 终止:系统为释放资源,彻底终止应用进程。

二、UIAbility的生命周期

UIAbility是包含UI界面的应用组件,是应用的"窗口",是应用的显示界面。其生命周期由UIAbilityContext和AbilityStage中的回调方法体现。核心的生命周期方法包括:

方法 描述
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) UIAbility创建实例时调用,用于初始化必要的资源,例如窗口设置等。在这个阶段中,窗口还未被创建,此时不必执行UI相关的操作
onWindowStageCreate(windowStage: window.WindowStage) UIAbility创建主窗口后调用,用于加载UI界面(windowStage.loadContent),设置窗口的监听事件
onForeground() UIAbility从后台返回前台并获得关注焦点时调用
onBackground() UIAbility从前台失去焦点,进入后台不可见状态时调用
onWindowStageDestroy() UIAbility的主窗口即将销毁时调用,用于清理窗口的相关资源,移除UI组件
onDestroy() UIAbility实例销毁前调用,执行最终的资源清理和状态的保存

图1 UIAbility的生命周期

UIAbility的生命周期包括如下几个状态:

UNINITIALIZED :onCreate 之前的初始状态。
CREATE (& WINDOW_STAGE_CREATE) :UIAbility被创建,其 UI 窗口已设置好,准备显示。
FOREGROUND :UIAbility 可见并可交互。这是用户使用的活跃状态。
BACKGROUND :UIAbility 不再可见,但仍在后台运行。应该在此处暂停非核心操作。
STOP (&WINDOW_STAGE_DESTROY & DESTROY):UIAbility 即将被销毁。应清理所有资源。

当在DevEco Studio创建一个新的项目模块时,会自动创建一个默认的UIAbility,默认会命名为"模块名"下面展示了entry模块的UIAbility,命名为EntryAbility,代码示例如下:

typescript 复制代码
export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    try {
      this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
    } catch (err) {
      hilog.error(DOMAIN, 'testTag', 'Failed to set colorMode. Cause: %{public}s', JSON.stringify(err));
    }
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy(): void {
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err) => {
      if (err.code) {
        hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
        return;
      }
      hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

测试上述的UIAbility,启动应用,并从后退按钮,将应用进入后台,注意此时,应用并没有关闭。运行的日志如图2所示:

图2 运行的日志

三、页面和自定义组件的生命周期

页面是基于@Component装饰的ArkUI组件。其生命周期由装饰器@Entry、@Component以及一系列生命周期函数来管理。其生命周期由视图栈相关。核心的生命周期方法如下表所示:

方法 描述
aboutToAppear() 在自定义组件即将出现时调用,具体时机是在创建自定义组件的新实例后,在执行其build()函数之前。调用一次。
build() 使用ArkUI提供的声明式语法来描述组件的UI布局和结构。每次渲染会被调用,可调用多次。
onDidBuild() 每次build执行完成后。用于监听组件的每次构建完成。可以处理每次UI渲染完成后执行一些操作。渲染后的操作,可以调用多次。
onPageShow() 当页面显示时,会触发当前页面内所有自定义组件的onPageShow生命周期。可以调用多次
onPageHide() 页面每次隐藏时触发,例如跳转到其他页面或进入后台。调用多次。
onBackPress() 当用户点击返回按钮时触发。可调用多次。
aboutToDisappear() 组件销毁或隐藏时,子组件先于父组件,调用一次。通常用于释放资源、取消订阅
页面和自定义组件的生命周期如图3所示:

图3 页面的生命周期

在上述创建的项目模块编辑的Index.ets页面的代码内容如下:

typescript 复制代码
@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  aboutToAppear() {
    console.log("Index页面:aboutToAppear")
  }
  onPageShow(){
    console.log("Index页面:onPageShow")
  }
  onBackPress() {
    console.log("Index页面:onBackPress")
  }
  onPageHide() {
    console.log("Index页面:onPageHide")
  }
  aboutToDisappear() {
    console.log("Index页面:aboutToDisappear")
  }
  
  build() {
    RelativeContainer() {
      Text(this.message)
        .id('HelloWorld')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.message = 'Welcome';
        })
    }
    .height('100%')
    .width('100%')
  }
}

再次运行该项目模块,然后点击后退按钮,这时日志的运行如图4所示:

图4 运行的日志

参考文献

HarmonyOS应用生命周期解析:从启动到销毁的全程管理 https://developer.huawei.com/consumer/cn/blog/topic/03196383530118205 【EB/OL】

相关推荐
浅念-15 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
猛扇赵四那边好嘴.15 小时前
Flutter 框架跨平台鸿蒙开发 - 旅行规划助手应用开发教程
flutter·华为·harmonyos
burning_maple15 小时前
mysql数据库笔记
数据库·笔记·mysql
hkNaruto15 小时前
【AI】AI学习笔记:LangGraph 与 LangChain的关系以及系统性学习路线选择
笔记·学习·langchain
jrlong16 小时前
DataWhale大模型基础与量化微调task3学习笔记(第 5章:深入大模型架构_MoE 架构解析)
笔记·学习
紫雾凌寒16 小时前
【 HarmonyOS 面试题】2026 最新 ArkTS 语言基础面试题
华为·面试·程序员·华为云·职场发展·harmonyos·arkts
摘星编程17 小时前
React Native鸿蒙:BiometricAuth指纹解锁实现
react native·react.js·harmonyos
以太浮标17 小时前
华为eNSP模拟器综合实验之- AC+AP无线网络调优与高密场景
java·服务器·华为
wdfk_prog17 小时前
[Linux]学习笔记系列 --[drivers][base]map
linux·笔记·学习
浅念-17 小时前
链表经典面试题目
c语言·数据结构·经验分享·笔记·学习·算法