鸿蒙UlAbility组件的生命周期(非常详细)
UIAbility 组件是一种包含 UI 的应用组件,主要用于和用户交互。
UIAbility 的生命周期包括 Create、Foreground、Background、Destroy 四个状态,如下图所示。

图 1 UIAbility 的生命周期
接下来详细讲解每个状态的特性。

图 2 打开EntryAbility.ts文件
如上图所示,打开 EntryAbility.ts 文件,我们在 onCreate 函数中打印一段话,运行时会发现这段话会在日志内显示。通常情况下我们会在 Create 状态下进行一些授权操作,比如初始化数据等。
【实例】在创建 UIAbility 实例时,使用 AppStorage 存储一些数据,在页面中读取并展示,代码及效果如下图所示。

图 3 使用AppStorage存储数据并展示
WindowStage 创建完成后会进入 onWindowStageCreate() 回调,可以在该回调中设置 UI 加载、WindowStage 的事件订阅等,如下图所示。

图 4 WindowStage
在 onWindowStageCreate() 回调中通过 loadContent() 方法设置应用要加载的页面,并根据需要调用 on('windowStageEvent') 方法订阅 WindowStage 的事件(获焦/失焦、可见/不可见)。

图 5 在windowStage.loadContent中设置需要加载的页面
如上图所示,我们在 windowStage.on 中设置当前窗口的状态,同时在 windowStage.loadContent 中设置需要加载的页面,也就是入口文件。
案例运行效果如下图所示:

图 6 案例运行效果
在 UIAbility 实例销毁之前,会先进入 onWindowStageDestroy() 回调,可以在该回调中释放 UI 资源,如下图所示。

图 7 在onWindowStageDestroy()回调中释放UI资源
onForeground() 在 UI 可见前触发,用于申请资源或重新申请释放的资源;而 onBackground() 在 UI 完全不可见后触发,用于释放无用资源和执行耗时操作,如状态保存。
例如,应用可在 onForeground() 回调中开启定位功能以获取用户位置信息。
下图展示了 UIAbility 组件不同的生命周期的调用顺序:打开应用→后台运行→删除应用。

图 8 UIAbility组件不同的生命周期的调用顺序
当应用的 UIAbility 实例已创建,且 UIAbility 配置为 singleton 启动模式时,再次调用 startAbility() 方法启动该 UIAbility 实例,只会进入该 UIAbility 的 onNewWant() 回调,不会进入其 onCreate() 和 onWindowStageCreate() 回调。
UIAbility 的生命周期包括 Create、Foreground、Background、Destroy 四个状态,如下图所示。

图 1 UIAbility 的生命周期
接下来详细讲解每个状态的特性。
UIAbility Create状态
在应用加载过程中,UIAbility 实例创建完成时触发 Create 状态,系统会调用 onCreate() 回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的 UI 展示。
图 2 打开EntryAbility.ts文件
如上图所示,打开 EntryAbility.ts 文件,我们在 onCreate 函数中打印一段话,运行时会发现这段话会在日志内显示。通常情况下我们会在 Create 状态下进行一些授权操作,比如初始化数据等。
【实例】在创建 UIAbility 实例时,使用 AppStorage 存储一些数据,在页面中读取并展示,代码及效果如下图所示。

图 3 使用AppStorage存储数据并展示
UIAbility WindowStage
UIAbility 实例创建完成之后,在进入 Foreground 之前,系统会创建一个 WindowStage。WindowStage 创建完成后会进入 onWindowStageCreate() 回调,可以在该回调中设置 UI 加载、WindowStage 的事件订阅等,如下图所示。

图 4 WindowStage
在 onWindowStageCreate() 回调中通过 loadContent() 方法设置应用要加载的页面,并根据需要调用 on('windowStageEvent') 方法订阅 WindowStage 的事件(获焦/失焦、可见/不可见)。

图 5 在windowStage.loadContent中设置需要加载的页面
如上图所示,我们在 windowStage.on 中设置当前窗口的状态,同时在 windowStage.loadContent 中设置需要加载的页面,也就是入口文件。
案例运行效果如下图所示:

图 6 案例运行效果
在 UIAbility 实例销毁之前,会先进入 onWindowStageDestroy() 回调,可以在该回调中释放 UI 资源,如下图所示。

图 7 在onWindowStageDestroy()回调中释放UI资源
UIAbility Foreground和Background状态
UIAbility 实例在前后台切换时触发 Foreground 和 Background 状态,分别对应 onForeground() 和 onBackground() 回调。onForeground() 在 UI 可见前触发,用于申请资源或重新申请释放的资源;而 onBackground() 在 UI 完全不可见后触发,用于释放无用资源和执行耗时操作,如状态保存。
例如,应用可在 onForeground() 回调中开启定位功能以获取用户位置信息。
UIAbility Destroy状态
Destroy 状态在 UIAbility 实例被销毁时触发,onDestroy() 回调用于释放系统资源和保存的数据。例如,用户通过最近任务列表关闭 UIAbility 实例时触发 Destroy 状态。下图展示了 UIAbility 组件不同的生命周期的调用顺序:打开应用→后台运行→删除应用。

图 8 UIAbility组件不同的生命周期的调用顺序
当应用的 UIAbility 实例已创建,且 UIAbility 配置为 singleton 启动模式时,再次调用 startAbility() 方法启动该 UIAbility 实例,只会进入该 UIAbility 的 onNewWant() 回调,不会进入其 onCreate() 和 onWindowStageCreate() 回调。