前言:首先要对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:组件从组件树卸载,即将进入缓存时调用。