当前位置:   article > 正文

【鸿蒙开发】生命周期_ability的生命周期回调函数

ability的生命周期回调函数

1. UIAbility组件生命周期

UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态。

UIAbility生命周期状态

 1.1 Create状态

Create状态为在应用加载过程中,UIAbility实例创建完成时触发,系统会调用onCreate()回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的UI界面展示。

  1. import UIAbility from '@ohos.app.ability.UIAbility';
  2. import Window from '@ohos.window';
  3. export default class EntryAbility extends UIAbility {
  4. onCreate(want, launchParam) {
  5. // 页面初始化
  6. }
  7. // ...
  8. }

1.2 WindowStageCreate和WindowStageDestroy状态

UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。WindowStage创建完成后会进入onWindowStageCreate()回调,可以在该回调中设置UI界面加载、设置WindowStage的事件订阅。

在onWindowStageCreate()回调中通过loadContent()方法设置应用要加载的页面并根据需要订阅WindowStage的事件(获焦/失焦、可见/不可见)。

  1. import UIAbility from '@ohos.app.ability.UIAbility';
  2. import Window from '@ohos.window';
  3. export default class EntryAbility extends UIAbility {
  4. onWindowStageCreate(windowStage: Window.WindowStage) {
  5. // 设置WindowStage的事件订阅(获焦/失焦、可见/不可见)
  6. // 设置UI界面加载
  7. windowStage.loadContent('pages/Index', (err, data) => {
  8. // ...
  9. });
  10. }
  11. }

在UIAbility实例销毁之前会进入onWindowStageDestroy()回调,可以释放UI界面资源。

  1. import UIAbility from '@ohos.app.ability.UIAbility';
  2. import Window from '@ohos.window';
  3. export default class EntryAbility extends UIAbility {
  4. // ...
  5. onWindowStageDestroy() {
  6. // 释放UI界面资源
  7. }
  8. }
  • onCreate:在 Ability 创建时被调用,用于执行初始化和设置业务逻辑。
  • onDestroy:在 Ability 销毁时触发,用于执行资源清理和其他清理操作。
  • onWindowStageCreate:在 WindowStage 创建完成后触发。
  • onWindowStageDestroy:在 WindowStage 销毁后触发。
  • onForeground:Ability 的生命周期回调,当应用从后台切换到前台时调用。
  • onBackground:Ability 的生命周期回调,当应用从前台切换到后台时调用。

2. 页面和自定义组件生命周期

2.1 页面生命周期

即被@Entry装饰的组件生命周期,提供以下生命周期接口:

  • onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。
  • onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
  • onBackPress:当用户点击返回按钮时触发。

2.2 组件生命周期

即一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:

  • aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。
  • aboutToDisappear:在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

2.3 生命周期流程

下图展示的是被@Entry装饰的组件(页面)生命周期。

2.4 自定义组件的渲染流程

  • ArkUI框架创建自定义组件
  • 初始化自定义组件的成员变量
  • 执行aboutToAppear方法
  • 执行build方法渲染组件,在首次渲染时,框架会记录状态变量和组件的映射关系
  • 当状态变量的值更改时,框架根据映射关系,执行这些UI组件的更新函数
  • if分支或者ForEach渲染的数组个数改变,组件将被删除,在删除前执行aboutToDisappear

不建议在aboutToDisappear内使用async await,如果在aboutToDisappear使用中Promise或者回调方法,自定义组件将被保留在Promise的闭包中,直到回调方法被执行完,这个行为阻止了自定义组件的垃圾回收。

 2.5 示例

  1. import router from '@ohos.router'
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State showChild: boolean = true;
  6. // 页面生命周期
  7. onPageShow() {
  8. console.info('Index onPageShow');
  9. }
  10. // 页面生命周期
  11. onPageHide() {
  12. console.info('Index onPageHide');
  13. }
  14. // 页面生命周期
  15. onBackPress() {
  16. console.info('Index onBackPress');
  17. }
  18. // 组件生命周期
  19. aboutToAppear() {
  20. console.info('Index aboutToAppear');
  21. }
  22. // 组件生命周期
  23. aboutToDisappear() {
  24. console.info('Index aboutToDisappear');
  25. }
  26. build() {
  27. Column() {
  28. // this.showChild为true,创建Child子组件,执行Child aboutToAppear
  29. if (this.showChild) {
  30. Child()
  31. }
  32. // this.showChild为false,删除Child子组件,执行Child aboutToDisappear
  33. Button('删除子组件 Child')
  34. .margin({ bottom: 20 })
  35. .onClick(() => {
  36. this.showChild = false;
  37. })
  38. // push到DetailPage页面,执行onPageHide
  39. Button('跳转到 DetailPage')
  40. .onClick(() => {
  41. router.pushUrl({ url: 'pages/DetailPage' });
  42. })
  43. }
  44. .width("100%")
  45. .height("100%")
  46. }
  47. }
  48. @Component
  49. struct Child {
  50. @State title: string = 'Child';
  51. // 组件生命周期
  52. aboutToAppear() {
  53. console.info('Child aboutToAppear')
  54. }
  55. // 组件生命周期
  56. aboutToDisappear() {
  57. console.info('Child aboutToDisappear')
  58. }
  59. build() {
  60. Text(this.title).fontSize(50).onClick(() => {
  61. this.title = 'Child Click';
  62. })
  63. }
  64. }

3. 同模块下的UIAbility跳转

3.1 创建 PaymentPage

  1. @Entry
  2. @Component
  3. struct PaymentPage {
  4. @State message: string = 'payment page'
  5. build() {
  6. Row() {
  7. Column() {
  8. Text(this.message)
  9. .fontSize(50)
  10. .fontWeight(FontWeight.Bold)
  11. }
  12. .width('100%')
  13. }
  14. .height('100%')
  15. }
  16. }

3.2 创建 PaymentAbility

修改 windowStage.loadContent 加载的页面

3.3 修改 Index.ets

  1. import common from '@ohos.app.ability.common'
  2. import Want from '@ohos.app.ability.Want'
  3. @Entry
  4. @Component
  5. struct Index {
  6. @State message: string = 'index page'
  7. build() {
  8. Row() {
  9. Column() {
  10. Text(this.message)
  11. .fontSize(50)
  12. .fontWeight(FontWeight.Bold)
  13. Button("去支付")
  14. .width('100%')
  15. .onClick(() => {
  16. const context = getContext(this) as common.UIAbilityContext;
  17. const want: Want = {
  18. 'deviceId': '', // deviceId为空表示本设备
  19. 'bundleName': 'com.example.myapplication',
  20. 'abilityName': 'PaymentAbility',
  21. 'moduleName': 'entry'
  22. }
  23. context.startAbility(want)
  24. })
  25. }
  26. .width('100%')
  27. }
  28. .height('100%')
  29. }
  30. }

4. 不同模块下的UIAbility跳转

4.1 创建模块

4.2 修改 paymentModule 模块的 Index.ets

  1. @Entry
  2. @Component
  3. struct Index {
  4. @State message: string = 'payment module page'
  5. build() {
  6. Row() {
  7. Column() {
  8. Text(this.message)
  9. .fontSize(50)
  10. .fontWeight(FontWeight.Bold)
  11. }
  12. .width('100%')
  13. }
  14. .height('100%')
  15. }
  16. }

4.3 修改 entry 模块的 Index.ets

修改 abilityName 和 moduleName

  1. import common from '@ohos.app.ability.common'
  2. import Want from '@ohos.app.ability.Want'
  3. @Entry
  4. @Component
  5. struct Index {
  6. @State message: string = 'index page'
  7. build() {
  8. Row() {
  9. Column() {
  10. Text(this.message)
  11. .fontSize(50)
  12. .fontWeight(FontWeight.Bold)
  13. Button("去支付")
  14. .width('100%')
  15. .onClick(() => {
  16. const context = getContext(this) as common.UIAbilityContext;
  17. const want: Want = {
  18. 'deviceId': '', // deviceId为空表示本设备
  19. 'bundleName': 'com.example.myapplication',
  20. 'abilityName': 'PaymentModuleAbility',
  21. 'moduleName': 'paymentModule'
  22. }
  23. context.startAbility(want)
  24. })
  25. }
  26. .width('100%')
  27. }
  28. .height('100%')
  29. }
  30. }

4.4 配置调起2个模块

 

4.5 两个模块之间传递数据

4.5.1 修改 entry 模块的 Index.ets

使用 parameters 选项添加自定义数据

使用 context.startAbilityForResult 方法启动 UIAbility 并获取返回结果

  1. import common from '@ohos.app.ability.common'
  2. import Want from '@ohos.app.ability.Want'
  3. type PaymentAbilityParams = Record<string, boolean>
  4. @Entry
  5. @Component
  6. struct Index {
  7. @State message: string = 'index page'
  8. build() {
  9. Row() {
  10. Column() {
  11. Text(this.message)
  12. .fontSize(50)
  13. .fontWeight(FontWeight.Bold)
  14. Button("去支付")
  15. .width('100%')
  16. .onClick(async () => {
  17. const context = getContext(this) as common.UIAbilityContext;
  18. const want: Want = {
  19. deviceId: '', // deviceId为空表示本设备
  20. bundleName: 'com.example.myapplication',
  21. abilityName: 'PaymentModuleAbility',
  22. moduleName: 'paymentModule',
  23. parameters: {
  24. orderId: Date.now()
  25. }
  26. }
  27. // context.startAbility(want)
  28. const paymentAbilityResult = await context.startAbilityForResult(want)
  29. const params = paymentAbilityResult.want?.parameters as PaymentAbilityParams
  30. if (params?.isPay) {
  31. AlertDialog.show({
  32. message: "支付成功"
  33. })
  34. } else {
  35. AlertDialog.show({
  36. message: "支付失败"
  37. })
  38. }
  39. })
  40. }
  41. .width('100%')
  42. }
  43. .height('100%')
  44. }
  45. }
4.5.2 修改 paymentModule 模块的 PaymentModuleAbility

在 UIAbility 的 onCreate 中接收参数,并保存到 AppStorage 中

  1. import UIAbility from '@ohos.app.ability.UIAbility';
  2. import hilog from '@ohos.hilog';
  3. import window from '@ohos.window';
  4. type AbilityParams = Record<string, number>
  5. export default class PaymentModuleAbility extends UIAbility {
  6. onCreate(want, launchParam) {
  7. const params = want.parameters as AbilityParams;
  8. AppStorage.SetOrCreate<number>("orderId", params.orderId);
  9. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  10. }
  11. onDestroy() {
  12. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  13. }
  14. onWindowStageCreate(windowStage: window.WindowStage) {
  15. // Main window is created, set main page for this ability
  16. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
  17. windowStage.loadContent('pages/Index', (err, data) => {
  18. if (err.code) {
  19. hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
  20. return;
  21. }
  22. hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
  23. });
  24. }
  25. onWindowStageDestroy() {
  26. // Main window is destroyed, release UI related resources
  27. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  28. }
  29. onForeground() {
  30. // Ability has brought to foreground
  31. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  32. }
  33. onBackground() {
  34. // Ability has back to background
  35. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  36. }
  37. }
4.5.3 修改 paymentModule 模块的 Index.ets

从 storage 中获取 orderId

点击支付按钮, PaymentModuleAbility 停止自身并返回结果

  1. import common from '@ohos.app.ability.common'
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State message: string = 'payment module page'
  6. @StorageProp("orderId") orderId: number = 0
  7. build() {
  8. Row() {
  9. Column() {
  10. Text(this.message)
  11. .fontSize(50)
  12. .fontWeight(FontWeight.Bold)
  13. Text(`${this.orderId}`)
  14. .fontSize(50)
  15. .fontColor(Color.Red)
  16. Button("支付").onClick(() => {
  17. const context = getContext(this) as common.UIAbilityContext;
  18. context.terminateSelfWithResult({
  19. resultCode: 1,
  20. want: {
  21. deviceId: '', // deviceId为空表示本设备
  22. bundleName: 'com.example.myapplications',
  23. abilityName: 'EntryAbility',
  24. moduleName: 'entry',
  25. parameters: {
  26. isPay: true
  27. }
  28. }
  29. })
  30. })
  31. }
  32. .width('100%')
  33. }
  34. .height('100%')
  35. }
  36. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/840484
推荐阅读
相关标签
  

闽ICP备14008679号