1# UIAbility组件生命周期 2 3 4## 概述 5 6当用户打开、切换和返回到对应应用时,应用中的[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调,通过这些回调可以知道当前UIAbility实例的某个状态发生改变,会经过UIAbility实例的创建和销毁,或者UIAbility实例发生了前后台的状态切换。 7 8UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态,如下图所示。 9 10**图1** UIAbility生命周期状态 11 12 13 14## 生命周期状态说明 15 16 17### Create状态 18 19Create状态为在应用加载过程中,[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)实例创建完成时触发,系统会调用[onCreate()](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityoncreate)回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的UI展示。 20 21 22```ts 23import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 24 25export default class EntryAbility extends UIAbility { 26 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { 27 // 页面初始化 28 } 29 // ... 30} 31``` 32 33> **说明**: 34> 35> [Want](../reference/apis-ability-kit/js-apis-app-ability-want.md)是对象间信息传递的载体,可以用于应用组件间的信息传递。Want的详细介绍请参见[信息传递载体Want](want-overview.md)。 36 37### WindowStageCreate和WindowStageDestroy状态 38 39[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。WindowStage创建完成后会进入[onWindowStageCreate()](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonwindowstagecreate)回调,可以在该回调中设置UI加载、设置WindowStage的事件订阅。 40 41**图2** WindowStageCreate和WindowStageDestroy状态 42 43 44在onWindowStageCreate()回调中通过[loadContent()](../reference/apis-arkui/js-apis-window.md#loadcontent9)方法设置应用要加载的页面,并根据需要调用[on('windowStageEvent')](../reference/apis-arkui/js-apis-window.md#onwindowstageevent9)方法订阅[WindowStage的事件](../reference/apis-arkui/js-apis-window.md#windowstageeventtype9)(获焦/失焦、切到前台/切到后台、前台可交互/前台不可交互)。 45 46> **说明:** 47> 48> 不同开发场景下[WindowStage事件](../reference/apis-arkui/js-apis-window.md#windowstageeventtype9)的时序可能存在差异。 49 50```ts 51import { UIAbility } from '@kit.AbilityKit'; 52import { window } from '@kit.ArkUI'; 53import { hilog } from '@kit.PerformanceAnalysisKit'; 54 55const TAG: string = '[EntryAbility]'; 56const DOMAIN_NUMBER: number = 0xFF00; 57 58export default class EntryAbility extends UIAbility { 59 // ... 60 onWindowStageCreate(windowStage: window.WindowStage): void { 61 // 设置WindowStage的事件订阅(获焦/失焦、切到前台/切到后台、前台可交互/前台不可交互) 62 try { 63 windowStage.on('windowStageEvent', (data) => { 64 let stageEventType: window.WindowStageEventType = data; 65 switch (stageEventType) { 66 case window.WindowStageEventType.SHOWN: // 切到前台 67 hilog.info(DOMAIN_NUMBER, TAG, `windowStage foreground.`); 68 break; 69 case window.WindowStageEventType.ACTIVE: // 获焦状态 70 hilog.info(DOMAIN_NUMBER, TAG, `windowStage active.`); 71 break; 72 case window.WindowStageEventType.INACTIVE: // 失焦状态 73 hilog.info(DOMAIN_NUMBER, TAG, `windowStage inactive.`); 74 break; 75 case window.WindowStageEventType.HIDDEN: // 切到后台 76 hilog.info(DOMAIN_NUMBER, TAG, `windowStage background.`); 77 break; 78 case window.WindowStageEventType.RESUMED: // 前台可交互状态 79 hilog.info(DOMAIN_NUMBER, TAG, `windowStage resumed.`); 80 break; 81 case window.WindowStageEventType.PAUSED: // 前台不可交互状态 82 hilog.info(DOMAIN_NUMBER, TAG, `windowStage paused.`); 83 break; 84 default: 85 break; 86 } 87 }); 88 } catch (exception) { 89 hilog.error(DOMAIN_NUMBER, TAG, 90 `Failed to enable the listener for window stage event changes. Cause: ${JSON.stringify(exception)}`); 91 } 92 hilog.info(DOMAIN_NUMBER, TAG, `%{public}s`, `Ability onWindowStageCreate`); 93 // 设置UI加载 94 windowStage.loadContent('pages/Index', (err, data) => { 95 // ... 96 }); 97 } 98} 99``` 100 101> **说明:** 102> 103> WindowStage的相关使用请参见[窗口开发指导](../windowmanager/application-window-stage.md)。 104 105对应于[onWindowStageCreate()](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonwindowstagecreate)回调。在[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)实例销毁之前,则会先进入[onWindowStageDestroy()](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonwindowstagedestroy)回调,可以在该回调中释放UI资源。 106 107```ts 108import { UIAbility } from '@kit.AbilityKit'; 109import { window } from '@kit.ArkUI'; 110import { hilog } from '@kit.PerformanceAnalysisKit'; 111import { BusinessError } from '@kit.BasicServicesKit'; 112 113const TAG: string = '[EntryAbility]'; 114const DOMAIN_NUMBER: number = 0xFF00; 115 116export default class EntryAbility extends UIAbility { 117 windowStage: window.WindowStage | undefined = undefined; 118 119 // ... 120 onWindowStageCreate(windowStage: window.WindowStage): void { 121 this.windowStage = windowStage; 122 // ... 123 } 124 125 onWindowStageDestroy() { 126 // 释放UI资源 127 // 例如在onWindowStageDestroy()中注销WindowStage事件订阅(获焦/失焦、切到前台/切到后台、前台可交互/前台不可交互) 128 try { 129 if (this.windowStage) { 130 this.windowStage.off('windowStageEvent'); 131 } 132 } catch (err) { 133 let code = (err as BusinessError).code; 134 let message = (err as BusinessError).message; 135 hilog.error(DOMAIN_NUMBER, TAG, `Failed to disable the listener for windowStageEvent. Code is ${code}, message is ${message}`); 136 } 137 } 138} 139``` 140 141### WindowStageWillDestroy状态 142对应[onWindowStageWillDestroy()](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonwindowstagewilldestroy12)回调,在WindowStage销毁前执行,此时WindowStage可以使用。 143 144```ts 145import { UIAbility } from '@kit.AbilityKit'; 146import { window } from '@kit.ArkUI'; 147 148export default class EntryAbility extends UIAbility { 149 windowStage: window.WindowStage | undefined = undefined; 150 // ... 151 onWindowStageCreate(windowStage: window.WindowStage): void { 152 this.windowStage = windowStage; 153 // ... 154 } 155 onWindowStageWillDestroy(windowStage: window.WindowStage) { 156 // 释放通过windowStage对象获取的资源 157 } 158 onWindowStageDestroy() { 159 // 释放UI资源 160 } 161} 162``` 163 164> **说明:** 165> 166> WindowStage的相关使用请参见[窗口开发指导](../windowmanager/application-window-stage.md)。 167 168 169### Foreground和Background状态 170 171Foreground和Background状态分别在[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)实例切换至前台和切换至后台时触发,对应于[onForeground()](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonforeground)回调和[onBackground()](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonbackground)回调。 172 173`onForeground()`回调,在UIAbility的UI可见之前,如UIAbility切换至前台时触发。可以在`onForeground()`回调中申请系统需要的资源,或者重新申请在`onBackground()`中释放的资源。 174 175`onBackground()`回调,在UIAbility的UI完全不可见之后,如UIAbility切换至后台时候触发。可以在`onBackground()`回调中释放UI不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。 176 177例如应用在使用过程中需要使用用户定位时,假设应用已获得用户的定位权限授权。在UI显示之前,可以在`onForeground()`回调中开启定位功能,从而获取到当前的位置信息。 178 179当应用切换到后台状态,可以在`onBackground()`回调中停止定位功能,以节省系统的资源消耗。 180 181 182```ts 183import { UIAbility } from '@kit.AbilityKit'; 184 185export default class EntryAbility extends UIAbility { 186 // ... 187 188 onForeground(): void { 189 // 申请系统需要的资源,或者重新申请在onBackground()中释放的资源 190 } 191 192 onBackground(): void { 193 // 释放UI不可见时无用的资源,或者在此回调中执行较为耗时的操作 194 // 例如状态保存等 195 } 196} 197``` 198 199当应用的UIAbility实例已创建,且UIAbility配置为[singleton](uiability-launch-type.md#singleton启动模式)启动模式时,再次调用[startAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability)方法启动该UIAbility实例时,只会进入该UIAbility的[onNewWant()](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonnewwant)回调,不会进入其[onCreate()](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityoncreate)和[onWindowStageCreate()](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonwindowstagecreate)生命周期回调。应用可以在该回调中更新要加载的资源和数据等,用于后续的UI展示。 200 201```ts 202import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 203 204export default class EntryAbility extends UIAbility { 205 // ... 206 207 onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) { 208 // 更新资源、数据 209 } 210} 211``` 212 213### Destroy状态 214 215Destroy状态在[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)实例销毁时触发。可以在onDestroy()回调中进行系统资源的释放、数据的保存等操作。 216 217例如,调用[terminateSelf()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextterminateself)方法停止当前UIAbility实例,执行onDestroy()回调,并完成UIAbility实例的销毁。 218<!--RP1-->再比如,用户使用最近任务列表关闭该UIAbility实例,执行onDestroy()回调,并完成UIAbility实例的销毁。<!--RP1End--> 219 220```ts 221import { UIAbility } from '@kit.AbilityKit'; 222 223export default class EntryAbility extends UIAbility { 224 // ... 225 226 onDestroy() { 227 // 系统资源的释放、数据的保存等 228 } 229} 230``` 231 232## 相关实例 233 234针对UIAbility生命周期,有以下相关实例可供参考: 235 236- [UIAbility和自定义组件生命周期(ArkTS)(API9)](https://gitee.com/openharmony/codelabs/tree/master/Ability/UIAbilityLifeCycle)