UIAbility生命周期
UIAbility的生命周期包括Create
、Foreground
、Background
、Destroy
四个状态。
Create状态
在应用首次创建UIAbility实例时触发,此时系统会调用onCreate()回调。可以在该回调中进行应用初始化操作,例如变量定义资源加载等,用于后续的UI界面展示。
1 2 3 4 5 6 7 8 9 10 11 12 |
// EntryAbility.ts import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; ... export default class EntryAbility extends UIAbility { ... onCreate(want, launchParam) { // 初始化应用 ... } ... } |
WindowStageCreate和WindowStageDestory状态
UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。WindowStage创建完成后会进入onWindowStageCreate()回调,可以在该回调中设置UI界面加载、设置WindowStage的事件订阅。
在onWindowStageCreate()回调中通过loadContent()方法设置应用要加载的页面,并根据需要调用on(‘windowStageEvent’)方法订阅WindowStage的事件(获焦/失焦、可见/不可见)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
onWindowStageCreate(windowStage: window.WindowStage): void { this.windowStage = windowStage // Setting Event Subscription for WindowStage (Obtained/Out-of-focus, Visible/Invisible) try { windowStage.on('windowStageEvent', this.windowStageEventFunc) } catch (exception) { hilog.error( this.domain, 'Failed to enable the listener for window stage event changes. Cause: %{public}', JSON.stringify(exception) ?? '' ) } // Main window is created, set main page for this ability // Setting UI Loading windowStage.loadContent('pages/LifeCyclePage', (err, data) => { hilog.info(this.domain, this.tag, 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '') }) } onWindowStageDestroy(): void { hilog.info(this.domain, this.tag, 'Ability is onWindowStageDestroy.') // Releasing UI Resources // Unregisters the WindowStage event for getting/out of focus in onWindowStageDestroy() try { this.windowStage?.off('windowStageEvent') } catch (exception) { hilog.error(this.domain, 'Failed to disable the listener for window stage event change. Cause: %{public}s', JSON.stringify(exception)) } } |
Foreground和Background状态
Foreground和Background状态分别在UIAbility实例切换至前台和切换至后台时触发,对应于onForeground()回调和onBackground()回调。
- onForeground()回调,在UIAbility的UI界面可见之前,如UIAbility切换至前台时触发。可以在onForeground()回调中申请系统需要的资源,或者重新申请在onBackground()中释放的资源。
- onBackground()回调,在UIAbility的UI界面完全不可见之后,如UIAbility切换至后台时候触发。可以在onBackground()回调中释放UI界面不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。
例如应用在使用过程中需要使用用户定位时,假设应用已获得用户的定位权限授权。在UI界面显示之前,可以在onForeground()回调中开启定位功能,从而获取到当前的位置信息。
当应用切换到后台状态,可以在onBackground()回调中停止定位功能,以节省系统的资源消耗。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// EntryAbility.ts import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; ... export default class EntryAbility extends UIAbility { ... onForeground() { // 申请系统所需的资源或在onBackground中申请释放的资源 ... } onBackground() { // UI不可见时释放无用资源,或在此回调中执行耗时操作 // 例如,状态保存 ... } } |
Destory状态
Destroy状态在UIAbility实例销毁时触发。可以在onDestroy()回调中进行系统资源的释放、数据的保存等操作。
例如调用terminateSelf()方法停止当前UIAbility实例,从而完成UIAbility实例的销毁;或者用户使用最近任务列表关闭该UIAbility实例,完成UIAbility的销毁。
1 2 3 4 5 6 7 8 9 10 11 12 |
// EntryAbility.ts import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; ... export default class EntryAbility extends UIAbility { ... onDestroy() { // 释放系统资源,保存数据 ... } ... } |
自定义组件生命周期
自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期变化,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用。
- 允许在生命周期函数中使用Promise和异步回调函数,比如网络资源获取,定时器设置等。
- 不允许在生命周期函数中使用async await。
自定义组件的生命周期包括aboutToAppear、onPageShow、onPageHide、onBackPress、aboutToDisappear五种状态,如图所示:
aboutToAppear
aboutToAppear?(): void
aboutToAppear函数在创建自定义组件的新实例后,在执行其build函数之前执行。aboutToAppear不同于onPageShow的地方在于该函数仅会在自定义组件实例创建后执行一次。允许在aboutToAppear函数中改变状态变量,更改将在后续执行build函数中生效。aboutToAppear函数可以用于接收自定义组件实例创建时的状态参数,初始化页面状态变量等。
aboutToDisappear
aboutToDisappear?(): void
aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。
onPageShow
onPageShow?(): void
页面每次显示时触发一次,包括路由过程、应用进入前后台等场景,仅@Entry修饰的自定义组件生效。
onPageHide
onPageHide?(): void
页面每次隐藏时触发一次,包括路由过程、应用进入前后台等场景,仅@Entry修饰的自定义组件生效。
onBackPress
onBackPress?(): void
当用户点击返回按钮时触发,仅@Entry修饰的自定义组件生效。返回true表示页面自己处理返回逻辑,不进行页面路由,返回false表示使用默认的路由返回逻辑。不设置返回值按照false处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
// LifeCyclePage.ets ... @Entry @Component struct LifeCyclePage { @State textColor: Color = Color.Black; aboutToAppear() { this.textColor = Color.Blue; Logger.info('[LifeCyclePage] LifeCyclePage aboutToAppear'); } onPageShow() { this.textColor = Color.Brown; Logger.info('[LifeCyclePage] LifeCyclePage onPageShow'); } onPageHide() { Logger.info('[LifeCyclePage] LifeCyclePage onPageHide'); } onBackPress() { this.textColor = Color.Red; Logger.info('[LifeCyclePage] LifeCyclePage onBackPress'); return false; } aboutToDisappear() { Logger.info('[LifeCyclePage] LifeCyclePage aboutToDisappear'); } build() { Column() { Text($r('app.string.hello_message')) .fontSize(CommonConstants.DEFAULT_FONT_SIZE) .fontColor(this.textColor) .margin(CommonConstants.DEFAULT_MARGIN) .fontWeight(FontWeight.Bold) } .width(CommonConstants.FULL_WIDTH) } } |
官网地址
https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717497122909477