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

#### 问题现象

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

#### 背景知识

UIAbility组件的核心生命周期回调包括onCreate、onForeground、onBackground、onDestroy。UIAbility的生命周期示意图如下：

#### 解决方案

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

#### 常见FAQ

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

A：参考onDestroy文档，提供了Promise异步回调示例。

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

A：针对Ability会触发onBackground，针对page页面会触发onPageHide，参考onPageHide。

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

A：当应用有多个Ability时，应用从任务中心上划终止运行时不会销毁所有的Ability，如果需要一并销毁其余的Ability，可以把对应的Ability的上下文对象context保存在AppStorage当中，在EntryAbility当中的onDestroy回调方法里面获取另外的Ability的context，再执行其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}`)
    })
  }
}
```