UIAbility组件各场景生命周期及监听
=====================

#### 问题现象

应用不同的启动方式，Ability的生命周期会稍有差异。在应用冷启、切后台等操作中Ability生命周期是什么状态？要如何监听生命周期变化？

#### 背景知识

[UIAbility组件的核心生命周期回调](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/uiability-lifecycle)包括onCreate、onForeground、onBackground、onDestroy。UIAbility的生命周期示意图如下：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/8/v3/KUUcHQ4ORziKeEO9mgQxJA/zh-cn_image_0000002658868621.png?HW-CC-KV=V1&HW-CC-Date=20260709T133822Z&HW-CC-Expire=86400&HW-CC-Sign=5DA795AA7E99D2B715808C717FB91A7237EB0E0E0D302734BEE39934C809BC41 "点击放大")

#### 解决方案

*   **场景一：如何监听UIAbility的生命周期？**
    
    如果需要感知UIAbility生命周期变化，开发者可以使用[ApplicationContext注册接口](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-inner-application-applicationcontext#applicationcontextonabilitylifecycle)监听UIAbility生命周期变化。详见[监听UIAbility生命周期变化](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-context-stage#监听uiability生命周期变化)。
    
*   **场景二：如何区分是热启动还是冷启动？**
    
    冷启动是进程不存在，UIAbility需先走创建流程[onCreate](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/uiability-lifecycle#oncreate)。而热启动是进程还在后台存在，UIAbility再被拉起时，会先调用[onNewWant](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-app-ability-uiability#onnewwant)。
    
*   **场景三：应用被系统或用户主动终止能否监听到？**
    
    用户上滑终止应用程序，则会触发Ability的[onDestroy](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/uiability-lifecycle#ondestroy)生命周期。
    
    如果是被系统终止，则无法监听到。
    
*   **场景四：如何主动终止Ability？**
    
    调用terminateSelf可以终止当前的UIAbility实例。如需要关闭应用所有的UIAbility实例，可以调用ApplicationContext的killAllProcesses()方法实现关闭应用所有的进程。
    
    **注意：**
    
    调用[terminateSelf](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-inner-application-uiabilitycontext#terminateself)方法和[ApplicationContext.killAllProcesses](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-inner-application-applicationcontext#applicationcontextkillallprocesses)方法终止或关闭UIAbility实例时，默认会保留该实例的快照（Snapshot），即在最近任务列表中仍然能查看到该实例对应的任务。如不需要保留该实例的快照，可以在其对应UIAbility的[module.json5](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/module-configuration-file)配置文件中，将Abilities标签的removeMissionAfterTerminate字段配置为true。
    

#### 常见FAQ

Q：onDestroy回调中是否可以做异步操作？

A：参考[onDestroy](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-app-ability-uiability#ondestroy)文档，提供了Promise异步回调示例。

Q：App从前台进入后台，先后触发哪些生命周期？

A：针对Ability会触发[onBackground](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/uiability-lifecycle#onbackground)，针对page页面会触发onPageHide，参考[onPageHide](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-custom-component-lifecycle#onpagehide)。

Q：任务中心上划终止App后，除了EntryAbility之外，其他的Ability（例如处理消息推送的PushMessageAbility）会一起销毁吗？

A：当应用有多个Ability时，应用从任务中心上划终止运行时不会销毁所有的Ability，如果需要一并销毁其余的Ability，可以把对应的Ability的上下文对象context保存在AppStorage当中，在EntryAbility当中的[onDestroy](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-app-ability-uiability#ondestroy)回调方法里面获取另外的Ability的context，再执行其[terminateSelf](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-inner-application-uiabilitycontext#terminateself)方法。

onDestroy(): void {
  const pushMessageContext = AppStorage.get('pushMessageContext') as common.UIAbilityContext
  if (pushMessageContext) {
    pushMessageContext.terminateSelf().catch((error: BusinessError) => {
      console.error(\`PushMessageAbility terminate error. code: ${error.code}, message: ${error.message}\`)
    })
  }
}