写点什么

鸿蒙开发实战:揭秘页面与项目生命周期,实现精准监控

  • 2024-11-04
    北京
  • 本文字数:4814 字

    阅读完需:约 16 分钟

前言

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

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

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


  • aboutToAppear(): 在组件的build()函数之前执行,是进行数据初始化、资源加载等操作的绝佳时机。

  • aboutToDisappear(): 在组件即将被销毁时调用,适合执行清理工作,如解除事件监听、释放资源等。

组件生命周期流程图

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

代码实战

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


// CustomComponent.ets@Entry@Componentexport 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 生命周期分析

生命周期状态详细说明


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 { // 在这里可以执行应用程序进入后台时的操作,如暂停动画、停止网络请求等 // ... }}
复制代码


发布于: 刚刚阅读数: 2
用户头像

还未添加个人签名 2021-11-19 加入

还未添加个人简介

评论

发布
暂无评论
鸿蒙开发实战:揭秘页面与项目生命周期,实现精准监控_鸿蒙_王二蛋和他的张大花_InfoQ写作社区