HarmonyOS中基于Stage模型开发的生命周期函数(钩子函数)

494 阅读4分钟

前言:首先要对Stage模型有个基础的了解,参考文件,下面只是在应用实际开发中用到的生命周期函数

  • 用DevEco-Studio新建一个Empty Ability就新建了一个Stage模型应用
  • 一个UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口,一个应用可以包含一个或多个UIAbility组件(UIAbility组件概述
  • 打开entry/src/main/ets/entryability/EntryAbility.ets文件,如下:
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

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

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

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

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

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

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

可以看见这个EntryAbility extends UIAbility,当前应用是一个UIAbility组件(在module.json5中可以看到组件配置信息)

{
  "module": {
    ...
    "abilities": [
      {
        "name": "EntryAbility", // UIAbility组件的名称
        "srcEntry": "./ets/entryability/EntryAbility.ets", // UIAbility组件的代码路径
        "description": "$string:EntryAbility_desc", // UIAbility组件的描述信息
        "icon": "$media:icon", // UIAbility组件的图标
        "label": "$string:EntryAbility_label", // UIAbility组件的标签
        "startWindowIcon": "$media:icon", // UIAbility组件启动页面图标资源文件的索引
        "startWindowBackground": "$color:start_window_background", // UIAbility组件启动页面背景颜色资源文件的索引
        ...
      }
    ]
  }
}

UIAbility组件的生命周期函数

onCreate、onWindowStageCreate、onForeground、onBackground、onWindowStageDestroy、onDestroy。都可以在EntryAbility.ets找到并补充相关业务事件。

  • onCreate:Create状态为在应用加载过程中,UIAbility实例创建完成时触发,系统会调用onCreate()回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的UI展示。
  • onDestroy:Destroy状态在UIAbility实例销毁时触发。可以在onDestroy()回调中进行系统资源的释放、数据的保存等操作。
  • onWindowStageCreate:UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。WindowStage创建完成后会进入onWindowStageCreate()回调,可以在该回调中设置UI加载、设置WindowStage的事件订阅。WindowStage的相关使用请参见窗口开发指导
  • onWindowStageDestroy:在UIAbility实例销毁之前,则会先进入onWindowStageDestroy()回调,可以在该回调中释放UI资源
  • onForeground:在UIAbility的UI可见之前,如UIAbility切换至前台时触发。可以在onForeground()回调中申请系统需要的资源,或者重新申请在onBackground()中释放的资源。
  • onBackground:在UIAbility的UI完全不可见之后,如UIAbility切换至后台时候触发。可以在onBackground()回调中释放UI不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。

页面生命周期

即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才可以调用页面的生命周期。

一个Stage模型的应用中可以有多个UIAbility,一个UIAbility中可以包含多个UI页面,页面生命周期函数有onPageShow、onPageHide、onBackPress

  • aboutToAppear:组件即将出现时回调该接口,具体时机为在创建组件的新实例后,在执行其build()函数之前执行。
  • aboutToDisappear:函数在组件销毁之前执行。不允许在aboutToDisappear()函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。
  • onPageShow: 页面每次显示时触发一次,包括路由过程、应用进入前台等场景。
  • onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
  • onBackPress:当用户点击返回按钮时触发。

自定义组件生命周期

@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期函数,有boutToAppear、aboutToDisappear。

  • boutToAppear:同页面组件一致,自定义组件不支持页面组件的其他生命周期函数。
  • aboutToDisappear:同页面组件一致,自定义组件不支持页面组件的其他生命周期函数。
  • onDidBuild:组件build()函数执行完成之后回调该接口,不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。

可复用自定义组件生命周期

@Component@Reusable装饰的UI单元,可复用组件从组件树上移除时,会进入到一个回收缓存区,后续创建新组件节点时,会复用缓存区中的节点,节约组件重新创建的时间。

  • aboutToReuse:组件即将挂载到组件树时调用。
  • aboutToRecycle:组件从组件树卸载,即将进入缓存时调用。