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'; 110 111export default class EntryAbility extends UIAbility { 112 windowStage: window.WindowStage | undefined = undefined; 113 114 // ... 115 onWindowStageCreate(windowStage: window.WindowStage): void { 116 this.windowStage = windowStage; 117 // ... 118 } 119 120 onWindowStageDestroy() { 121 // 释放UI资源 122 } 123} 124``` 125 126### WindowStageWillDestroy状态 127对应[onWindowStageWillDestroy()](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#uiabilityonwindowstagewilldestroy12)回调,在WindowStage销毁前执行,此时WindowStage可以使用。 128 129```ts 130import { UIAbility } from '@kit.AbilityKit'; 131import { window } from '@kit.ArkUI'; 132import { BusinessError } from '@kit.BasicServicesKit'; 133import { hilog } from '@kit.PerformanceAnalysisKit'; 134 135const TAG: string = '[EntryAbility]'; 136const DOMAIN_NUMBER: number = 0xFF00; 137 138export default class EntryAbility extends UIAbility { 139 windowStage: window.WindowStage | undefined = undefined; 140 // ... 141 onWindowStageCreate(windowStage: window.WindowStage): void { 142 this.windowStage = windowStage; 143 // ... 144 } 145 146 onWindowStageWillDestroy(windowStage: window.WindowStage) { 147 // 释放通过windowStage对象获取的资源 148 // 在onWindowStageWillDestroy()中注销WindowStage事件订阅(获焦/失焦、切到前台/切到后台、前台可交互/前台不可交互) 149 try { 150 if (this.windowStage) { 151 this.windowStage.off('windowStageEvent'); 152 } 153 } catch (err) { 154 let code = (err as BusinessError).code; 155 let message = (err as BusinessError).message; 156 hilog.error(DOMAIN_NUMBER, TAG, `Failed to disable the listener for windowStageEvent. Code is ${code}, message is ${message}`); 157 } 158 } 159 160 onWindowStageDestroy() { 161 // 释放UI资源 162 } 163} 164``` 165 166> **说明:** 167> 168> WindowStage的相关使用请参见[窗口开发指导](../windowmanager/application-window-stage.md)。 169 170 171### Foreground和Background状态 172 173Foreground和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)回调。 174 175`onForeground()`回调,在UIAbility的UI可见之前,如UIAbility切换至前台时触发。可以在`onForeground()`回调中申请系统需要的资源,或者重新申请在`onBackground()`中释放的资源。 176 177`onBackground()`回调,在UIAbility的UI完全不可见之后,如UIAbility切换至后台时候触发。可以在`onBackground()`回调中释放UI不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。 178 179例如应用在使用过程中需要使用用户定位时,假设应用已获得用户的定位权限授权。在UI显示之前,可以在`onForeground()`回调中开启定位功能,从而获取到当前的位置信息。 180 181当应用切换到后台状态,可以在`onBackground()`回调中停止定位功能,以节省系统的资源消耗。 182 183 184```ts 185import { UIAbility } from '@kit.AbilityKit'; 186 187export default class EntryAbility extends UIAbility { 188 // ... 189 190 onForeground(): void { 191 // 申请系统需要的资源,或者重新申请在onBackground()中释放的资源 192 } 193 194 onBackground(): void { 195 // 释放UI不可见时无用的资源,或者在此回调中执行较为耗时的操作 196 // 例如状态保存等 197 } 198} 199``` 200 201当应用的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展示。 202 203```ts 204import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 205 206export default class EntryAbility extends UIAbility { 207 // ... 208 209 onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) { 210 // 更新资源、数据 211 } 212} 213``` 214 215### Destroy状态 216 217Destroy状态在[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)实例销毁时触发。可以在onDestroy()回调中进行系统资源的释放、数据的保存等操作。 218 219例如,调用[terminateSelf()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextterminateself)方法停止当前UIAbility实例,执行onDestroy()回调,并完成UIAbility实例的销毁。 220<!--RP1-->再比如,用户使用最近任务列表关闭该UIAbility实例,执行onDestroy()回调,并完成UIAbility实例的销毁。<!--RP1End--> 221 222```ts 223import { UIAbility } from '@kit.AbilityKit'; 224 225export default class EntryAbility extends UIAbility { 226 // ... 227 228 onDestroy() { 229 // 系统资源的释放、数据的保存等 230 } 231} 232``` 233 234## 相关实例 235 236针对UIAbility生命周期,有以下相关实例可供参考: 237 238- [UIAbility和自定义组件生命周期(ArkTS)(API9)](https://gitee.com/openharmony/codelabs/tree/master/Ability/UIAbilityLifeCycle)