前言

在鸿蒙应用开发中,每一个页面和组件都承载着特定的生命周期。这些生命周期阶段,如同生命的轨迹,记录着页面从诞生到消亡的每一个重要时刻。深入理解和监控这些生命周期,不仅能提升应用性能,还能帮助我们更好地把握用户体验。

1. 鸿蒙@Component组件生命周期详解

在鸿蒙的ArkTS框架中,自定义组件拥有两个至关重要的生命周期函数:aboutToAppear()aboutToDisappear()。这两个函数分别在组件即将显示和即将消失时被系统自动调用,为开发者提供了在特定时机执行特定操作的机会。

  • aboutToAppear(): 在组件的build()函数之前执行,是进行数据初始化、资源加载等操作的绝佳时机。
  • aboutToDisappear(): 在组件即将被销毁时调用,适合执行清理工作,如解除事件监听、释放资源等。

组件生命周期流程图

+-----------------+
| ArkTS 组件      |
+-----------------+
    |
    | 初始化数据
    V
+------------+
| aboutToAppear() |
+------------+
    |
    | 组件构建与渲染
    V
(build() 和其他逻辑)
    |
    | 用户交互
    | ...
    V
+-----------------+
| aboutToDisappear() |
+-----------------+
    |
    | 组件销毁前准备
    V
(组件被销毁)

代码实战

下面是一个简单的示例,展示了如何在鸿蒙组件中使用这两个生命周期函数:

// CustomComponent.ets
@Entry
@Component
export default struct CustomComponent {

  // 组件即将显示时调用
  aboutToAppear() {
    console.log('CustomComponent: aboutToAppear called. Component is about to appear.');
    // 在这里执行初始化数据的操作
  }

  // 组件即将消失时调用
  aboutToDisappear() {
    console.log('CustomComponent: aboutToDisappear called. Component is about to disappear.');
    // 在这里执行销毁前的准备操作
  }

  build() {
    // 组件的构建和渲染逻辑
    Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
      Text('This is a CustomComponent').fontSize(24).margin({ top: 20 })
      // 其他组件或布局...
    }.width('100%').height('100%')
  }
}

深入探索

通过精准地控制和管理组件的生命周期,我们可以实现更加高效的应用开发和更加流畅的用户体验。此外,结合一些APM性能监控工具,我们还能对应用进行实时分析和调优,确保应用始终运行在最佳状态。

2. 页面入口组件生命周期深度剖析

在鸿蒙开发中,页面入口组件扮演着至关重要的角色。这些组件被@Entry装饰,不仅拥有常规的组件生命周期函数,还额外提供了三个特定于页面入口的生命周期函数:onPageShow()onBackPress()onPageHide()。这些函数使得开发者能够更精确地控制页面在不同状态下的行为。

生命周期函数详解

  • onPageShow():当软件进入页面时执行。此时,页面已经完成了构建和渲染,并准备向用户展示。这是进行页面数据加载、动画启动等操作的理想时机。
  • onBackPress():当用户点击返回键或执行其他返回操作时执行。开发者可以在此函数中执行一些清理工作,如保存用户输入、确认用户是否真的要离开页面等。
  • onPageHide():当用户按下手机Home键返回到手机主界面或执行其他导致页面隐藏的操作时执行。此时,页面仍然保留在内存中,但不再对用户可见。开发者可以在此函数中暂停一些不必要的后台操作,以节省系统资源。

如果应用被完全销毁(如用户手动退出应用或系统因内存不足而终止应用),则会调用aboutToDisappear()函数。与onPageHide()不同,aboutToDisappear()表示组件即将被完全销毁,不再保留在内存中。因此,开发者应在此函数中执行必要的清理工作,如释放资源、解除事件监听等。

生命周期流程图

+------------------+
| @Entry 组件      |
+------------------+
    |
    | 页面即将出现
    V
+-----------------+
| aboutToAppear() |
+-----------------+
    |
    | 组件构建与渲染
    V
+------------+
| build()      |
+------------+
    |
    | 页面显示完成
    V
+-------------+
| onPageShow() |
+-------------+
    |
    | 用户交互与操作
    | ...
    V
+----------------+
| 用户操作或交互 |
+----------------+
    |
    | 用户点击返回键或离开页面
    V
+--------------+
| onBackPress() |
+--------------+
    |
    | 页面隐藏
    V
+--------------+
| onPageHide()  |
+--------------+
    |
    | 应用销毁或页面不再需要
    V
+-----------------+
| aboutToDisappear() |
+-----------------+
    |
    | 组件被销毁
    V
(组件被完全移除出内存)

实战指南

  • 合理利用生命周期函数:根据页面和组件的需求,在合适的生命周期函数中执行相应的操作。例如,在onPageShow()中加载数据,在onPageHide()中暂停后台任务。
  • 注意资源管理:在aboutToDisappear()中确保释放所有不再需要的资源,以避免内存泄漏和性能问题。
  • 用户交互与导航:在onBackPress()中处理用户返回操作,确保用户能够流畅地导航和退出页面。

通过深入理解并合理利用页面入口组件的生命周期函数,我们可以打造更加高效、流畅且用户友好的鸿蒙应用。

3、UIAbility 生命周期分析

生命周期状态详细说明

9b77a014169f31d3836726a75a31e98f.webp.png

Create状态

Create状态发生在应用加载过程中,当UIAbility实例创建完成时触发。系统会调用onCreate()回调方法。在这个回调方法中,开发者可以进行页面初始化操作,例如变量定义、资源加载等,为后续的UI展示做准备。

import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import UIAbility from '@ohos.app.ability.UIAbility';
import Want from '@ohos.app.ability.Want';

export default class EntryAbility extends UIAbility {
    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
        // 页面初始化,例如加载数据、设置初始状态等
    }
    // ... 其他方法
}

WindowStageCreate状态

在UIAbility实例创建完成之后,但在进入前台(Foreground)显示之前,系统会创建一个WindowStage。WindowStage是应用窗口的抽象表示,它包含了窗口的渲染、事件处理等功能。

当WindowStage创建完成后,系统会调用onWindowStageCreate()回调方法。在这个回调方法中,开发者可以设置项目的配置,跳转的首页。这样,当WindowStage进入前台显示时,应用已经准备好了要展示的UI内容和处理用户交互的能力。


export default class EntryAbility extends UIAbility {
    // ... 其他方法

onWindowStageCreate(windowStage: window.WindowStage): void {
  const applicationContext = this.context.getApplicationContext()
  //加载开始
  let entryPage = 'pages/main/IndexPage'
  //加载配置
  let config = ...
  }

    // ... 其他方法
}

实战指南

  1. 配置项目基础数据:在onWindowStageCreate函数中可以配置项目基本配置
  2. 事件订阅与处理:在onWindowStageCreate订阅一些生命周期函数

4、监控订阅

EntryAbility中,我们通常需要监听应用程序状态的变化以及Ability的生命周期事件。通过监听这些事件,我们可以更好地管理资源、执行特定逻辑以及优化用户体验。

EntryAbility 类

// EntryAbility 类扩展自 UIAbility,用于管理应用的生命周期和事件监听
export default class EntryAbility extends UIAbility {
    // 用于保存Ability Lifecycle的监听ID
    private lifecycleId: number = -1;

    // 当WindowStage创建时触发
    onWindowStageCreate(windowStage: window.WindowStage): void {
        // 获取应用上下文
        const applicationContext = this.context.getApplicationContext();

        // 监听应用程序状态变化
        // 创建一个EntryApplicationStateChangeCallback实例来处理状态变化
        applicationContext.on('applicationStateChange', new EntryApplicationStateChangeCallback());

        // 监听Ability Lifecycle事件
        // 创建一个EntryAbilityLifecycleCallback实例,并获取监听ID
        this.lifecycleId = applicationContext.on('abilityLifecycle', new EntryAbilityLifecycleCallback());

        // 在这里可以执行WindowStage创建后的初始化操作
        // ...
    }

    // 当Ability销毁时触发
    onDestroy(): void {
        // 获取应用上下文
        const applicationContext = this.context.getApplicationContext();

        // 注销应用程序状态变化的监听
        applicationContext.off('applicationStateChange');

        // 如果有Ability Lifecycle的监听ID,则注销监听
        if (this.lifecycleId !== -1) {
            applicationContext.off('abilityLifecycle', this.lifecycleId);
        }

        // 在这里可以执行清理资源和释放内存的操作
        // ...
    }

    // ... 其他方法
}

EntryAbilityLifecycleCallback 类

// EntryAbilityLifecycleCallback 类扩展自 AbilityLifecycleCallback,用于处理Ability的生命周期事件
export default class EntryAbilityLifecycleCallback extends AbilityLifecycleCallback {
    // 当Ability创建时触发
    onAbilityCreate(ability: UIAbility): void {
        // 在这里可以执行Ability创建后的初始化操作
        // ...
    }

    // 当WindowStage创建时触发
    onWindowStageCreate(ability: UIAbility, windowStage: window.WindowStage): void {
        // 在这里可以执行WindowStage创建后的初始化操作
        // ...
    }

    // 当页面获取到焦点时触发
    onWindowStageActive(ability: UIAbility, windowStage: window.WindowStage): void {
        // 在这里可以执行页面激活时的操作,如恢复状态、刷新数据等
        // ...
    }

    // 当WindowStage失焦时触发
    onWindowStageInactive(ability: UIAbility, windowStage: window.WindowStage): void {
        // 在这里可以执行页面失焦时的操作,如暂停动画、保存状态等
        // ...
    }

    // 当WindowStage销毁时触发
    onWindowStageDestroy(ability: UIAbility, windowStage: window.WindowStage): void {
        // 在这里可以执行WindowStage销毁前的清理操作
        // ...
    }

    // 当Ability销毁时触发
    onAbilityDestroy(ability: UIAbility): void {
        // 在这里可以执行Ability销毁前的清理操作
        // ...
    }

    // 当Ability进入前台时触发
    onAbilityForeground(ability: UIAbility): void {
        // 在这里可以执行Ability进入前台时的操作,如恢复暂停的动画等
        // ...
    }

    // 当Ability进入后台时触发
    onAbilityBackground(ability: UIAbility): void {
        // 在这里可以执行Ability进入后台时的操作,如暂停动画、保存状态等
        // ...
    }

    // 当Ability从暂停状态恢复时触发
    onAbilityContinue(ability: UIAbility): void {
        // 在这里可以执行Ability恢复时的操作,如继续动画等
        // ...
    }
}

EntryApplicationStateChangeCallback 类

// EntryApplicationStateChangeCallback 类扩展自 ApplicationStateChangeCallback,用于处理应用程序状态变化事件
export default class EntryApplicationStateChangeCallback extends ApplicationStateChangeCallback {
    // 当应用程序进入前台时触发
    onApplicationForeground(): void {
        // 在这里可以执行应用程序进入前台时的操作,如恢复网络请求等
        // ...
    }

    // 当应用程序进入后台时触发
    onApplicationBackground(): void {
        // 在这里可以执行应用程序进入后台时的操作,如暂停动画、停止网络请求等
        // ...
    }
}

王二蛋和他的狗
10 声望3 粉丝

Android开发高级工程师