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