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】

相关推荐
yuhaiqun19892 小时前
发现前端性能瓶颈的巧妙方法:建立“现象归因→分析定位→优化验证”的闭环思维
前端·经验分享·笔记·python·学习·课程设计·学习方法
sz66cm2 小时前
Linux基础 -- xargs 结合 `bash -lc` 参数传递映射规则笔记
linux·笔记·bash
d111111111d2 小时前
使用STM32 HAL库配置ADC单次转换模式详解
笔记·stm32·单片机·嵌入式硬件·学习
亚伯拉罕·黄肯2 小时前
强化学习算法笔记
笔记·算法
DYS_房东的猫2 小时前
学习总结笔记三:让网站“活”起来——处理静态文件、表单验证与用户登录(第3章实战版)
笔记·学习·golang
北京理工大学软件工程2 小时前
深度学习笔记(b站2025李宏毅课程)
人工智能·笔记·深度学习
polarislove02143 小时前
9.3 输出比较-嵌入式铁头山羊STM32笔记
笔记·stm32·嵌入式硬件
弘毅 失败的 mian3 小时前
Git 标签管理
经验分享·笔记·git
2501_946213903 小时前
Zettlr(科研笔记) v4.0.0 中文免费版
java·经验分享·笔记·pdf·github·ocr·开源软件