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】

相关推荐
羊群智妍6 小时前
2026 AI搜索流量密码:免费GEO监测工具,优化效果看得见
笔记·百度·微信·facebook·新浪微博
小镇敲码人7 小时前
探索华为CANN框架中的Ops-NN仓库
华为·cann·ops-nn
lbb 小魔仙8 小时前
【HarmonyOS实战】OpenHarmony + RN:自定义 useValidator 表单验证
华为·harmonyos
山岚的运维笔记8 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
lpruoyu10 小时前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习
wdfk_prog10 小时前
[Linux]学习笔记系列 -- [drivers][mmc][mmc_sdio]
linux·笔记·学习
仓颉编程语言10 小时前
鸿蒙仓颉编程语言挑战赛二等奖作品:TaskGenie 打造基于仓颉语言的智能办公“任务中枢”
华为·鸿蒙·仓颉编程语言
果果燕10 小时前
今日学习笔记:双向链表、循环链表、栈
笔记·学习·链表
一起养小猫10 小时前
Flutter for OpenHarmony 实战:扫雷游戏完整开发指南
flutter·harmonyos
觉醒大王10 小时前
AI写的青基中了
人工智能·笔记·深度学习·学习·职场和发展·学习方法