HarmonyOS应用开发实战:萌宠日记 - 生命周期在萌宠日记中的实践

前言

UIAbility 生命周期 是 HarmonyOS Stage 模型 的核心概念之一,它管理着应用从 创建销毁 的完整过程。在 萌宠日记 应用中,我们充分利用了 UIAbility 的各个生命周期阶段,实现全局初始化窗口管理状态保存资源释放 等关键功能。

理解 UIAbility 生命周期,是掌握 HarmonyOS 应用开发的基础。本文将从 萌宠日记 的真实代码出发,逐一解析每个生命周期方法的实际用途和最佳实践。

一、UIAbility 生命周期概述

1.1 生命周期全景图

UIAbility 的生命周期包含以下关键阶段,按执行顺序排列:

阶段 方法 触发时机 典型用途
创建 onCreate Ability 首次创建 全局初始化、数据准备
窗口创建 onWindowStageCreate 窗口创建完毕 加载主页面、设置窗口属性
前后台 onForeground 应用切换到前台 恢复资源、刷新 UI
前后台 onBackground 应用切换到后台 保存状态、释放资源
窗口销毁 onWindowStageDestroy 窗口销毁前 清理窗口资源
销毁 onDestroy Ability 销毁前 释放全局资源

1.2 萌宠日记的完整实现

typescript 复制代码
// EntryAbility.ets --- 完整生命周期实现
import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';

const DOMAIN = 0x0000;

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    try {
      this.context.getApplicationContext()
        .setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
    } catch (err) {
      hilog.error(DOMAIN, 'testTag',
        'Failed to set colorMode. Cause: %{public}s', JSON.stringify(err));
    }
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy(): void {
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
    windowStage.loadContent('pages/SplashPage', (err) => {
      if (err.code) {
        hilog.error(DOMAIN, 'testTag',
          'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
        return;
      }
      hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
    });
  }

  onWindowStageDestroy(): void {
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

提示%{public}s 是 hilog 的格式化占位符,表示该参数为公开信息,不会在日志中隐私过滤。对于敏感数据应使用 %{private}s

二、onCreate --- 应用初始化

2.1 方法签名与参数

typescript 复制代码
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void

onCreate 接收两个关键参数:

  • want : Want 对象,包含启动时传入的参数信息
  • launchParam : LaunchParam 枚举,标识启动原因(如正常启动、冷启动、热启动等)

LaunchParam 枚举值:

枚举值 说明 萌宠日记场景
LAUNCH_STANDARD 标准启动 用户点击图标启动
LAUNCH_COLD 冷启动 进程被杀死后重启
LAUNCH_WARM 热启动 后台进程被拉起
LAUNCH_NEW 新实例启动 多实例模式创建新实例

2.2 萌宠日记的初始化逻辑

萌宠日记 中,onCreate 方法主要完成两项初始化工作:

typescript 复制代码
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  try {
    // 1. 设置颜色模式 --- 跟随系统
    this.context.getApplicationContext()
      .setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
  } catch (err) {
    hilog.error(DOMAIN, 'testTag',
      'Failed to set colorMode. Cause: %{public}s', JSON.stringify(err));
  }
  // 2. 记录启动日志
  hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
}

初始化逻辑的关键要点:

  1. 颜色模式设置COLOR_MODE_NOT_SET 表示跟随系统设置,让应用在深色/浅色模式下自动适配
  2. 异常处理 :使用 try-catch 包裹,确保颜色设置失败不影响应用启动
  3. 日志记录 :使用 hilog 记录关键生命周期事件,方便调试

三、onWindowStageCreate --- 窗口与页面加载

3.1 窗口阶段概念

onWindowStageCreate 是 UIAbility 中 最核心 的生命周期方法之一,它在 窗口创建完成 时被调用。此时开发者可以:

  1. 加载主页面内容
  2. 设置窗口属性(全屏、方向等)
  3. 订阅窗口事件
  4. 初始化窗口级 UI 组件

3.2 萌宠日记的页面加载实现

typescript 复制代码
onWindowStageCreate(windowStage: window.WindowStage): void {
  hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

  windowStage.loadContent('pages/SplashPage', (err) => {
    if (err.code) {
      hilog.error(DOMAIN, 'testTag',
        'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
      return;
    }
    hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
  });
}

loadContent 方法详解:

参数 类型 说明 萌宠日记值
path string 页面路径 'pages/SplashPage'
callback AsyncCallback<void> 加载完成回调 日志记录成功/失败

3.3 为什么从 SplashPage 开始?

萌宠日记 选择闪屏页作为首个加载页面,而非直接进入主页,理由如下:

  1. 品牌展示:在 SplashPage 展示应用 Logo 和品牌标语("记录爱·陪伴成长💕")
  2. 加载缓冲:为后续数据加载争取时间,避免白屏
  3. 用户体验:平滑过渡到主界面,提升首次启动体验

SplashPage 的完整实现:

typescript 复制代码
// SplashPage.ets
@Entry
@Component
struct SplashPage {
  build() {
    Column() {
      // 应用 Logo 和标题
      Row({ space: 12 }) {
        Text('🐾').fontSize(48)
        Text('萌宠日记').fontSize(36).fontWeight(FontWeight.Bold).fontColor('#333333')
      }
      Text('记录爱·陪伴成长💕').fontSize(16).fontColor('#F5A623').margin({ top: 8 })

      // 宠物插画占位
      Column() {
        Text('🐱').fontSize(80)
      }
      .width(200).height(200).backgroundColor('#FFF3E0').borderRadius(100)

      // 开始按钮
      Button('开始记录')
        .width('70%').height(48).fontSize(18).fontColor(Color.White)
        .backgroundColor('#F5A623').borderRadius(24)
        .onClick(() => {
          router.pushUrl({ url: 'pages/Index' })
        })
    }
    .width('100%').height('100%').backgroundColor('#FFF8F0')
  }
}

四、onForeground --- 前台恢复

4.1 触发场景

onForeground 在以下场景被触发:

  1. 应用首次启动,窗口创建完成后
  2. 应用从后台切换回前台
  3. 应用被系统从挂起状态唤醒

4.2 萌宠日记的前台处理

typescript 复制代码
onForeground(): void {
  hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground');
}

在萌宠日记的当前版本中,onForeground 仅记录日志。但在实际生产环境中,这里可以扩展如下:

typescript 复制代码
// 扩展后的前台处理示例
onForeground(): void {
  hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground');
  // 1. 刷新首页数据 --- 重新拉取宠物状态
  // 2. 检查提醒事项 --- 弹窗展示到期待办
  // 3. 恢复动画 --- 暂停的动画重新播放
  // 4. 更新在线状态 --- 向服务器发送在线信号
}

五、onBackground --- 后台挂起

5.1 触发场景

onBackground 在应用切换至后台时触发,是 保存状态 的最佳时机。

5.2 萌宠日记的后台处理

typescript 复制代码
onBackground(): void {
  hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground');
}

扩展的后台处理逻辑:

有序列表 --- 后台处理优先级:

  1. 保存草稿:将未完成的日记内容持久化到 Preferences
  2. 暂停动画:停止不必要的动画和定时器,节省电量
  3. 释放内存:清理图片缓存、临时数据
  4. 记录时间戳:记录进入后台的时间,用于前台时计算"离开多久"

六、onWindowStageDestroy 与 onDestroy --- 资源清理

6.1 窗口销毁

typescript 复制代码
onWindowStageDestroy(): void {
  hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  // 释放窗口资源:取消窗口事件订阅、释放窗口级渲染资源
}

6.2 Ability 销毁

typescript 复制代码
onDestroy(): void {
  hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy');
  // 释放全局资源:关闭数据库连接、取消全局事件监听
}

七、生命周期状态流转图

生命周期流转的核心规则:

  • 应用启动:onCreateonWindowStageCreateonForeground
  • 切到后台:onBackground
  • 切回前台:onForeground(注意:不会重新走 onCreate)
  • 应用退出:onBackgroundonWindowStageDestroyonDestroy

八、生命周期在调试中的应用

8.1 日志查看方法

萌宠日记使用 hilog 记录生命周期日志,可通过以下命令查看:

bash 复制代码
# 查看应用生命周期日志
hilog -D 0x0000 -T testTag

# 过滤特定标签
hilog -D 0x0000 -T testTag | grep -E "onCreate|onDestroy|onForeground|onBackground"

8.2 日志级别说明

级别 方法 用途 是否隐私
INFO hilog.info 正常流程记录 公开 %{public}s
ERROR hilog.error 异常情况记录 公开 %{public}s
DEBUG hilog.debug 调试信息 可私有

九、生命周期与 UI 数据同步

9.1 数据同步策略

UIAbility 与 UI 页面的数据同步,遵循以下原则:

typescript 复制代码
// 在 UIAbility 中更新数据
class EntryAbility extends UIAbility {
  private appData: Map<string, Object> = new Map()

  onCreate(): void {
    // 初始化全局数据
    this.appData.set('initTime', Date.now())
  }

  onForeground(): void {
    // 刷新数据时通过 EventHub 通知 UI
    this.context.eventHub.on('dataUpdate', (data: Object) => {
      // 处理数据更新
    })
  }
}

9.2 萌宠日记的数据同步场景

萌宠日记 应用中,以下场景需要生命周期与 UI 同步:

  1. 应用从后台切回前台 → 刷新首页的今日记录
  2. 应用启动完成 → 加载宠物档案数据
  3. 应用进入后台 → 自动保存日记草稿
  4. 应用被销毁 → 保存用户偏好设置

十、启动模式对生命周期的影响

10.1 三种启动模式

启动模式 配置方式 生命周期行为 适用场景
singleton 默认 单实例,复用已有 Ability 萌宠日记(默认)
standard 配置指定 每次启动创建新实例 多任务场景
multiton 配置指定 指定标识创建新实例 文档编辑

10.2 萌宠日记的启动模式配置

json 复制代码
{
  "abilities": [
    {
      "name": "EntryAbility",
      "srcEntry": "./ets/entryability/EntryAbility.ets",
      "launchType": "singleton",
      "exported": true,
      "skills": [
        {
          "entities": ["entity.system.home"],
          "actions": ["ohos.want.action.home"]
        }
      ]
    }
  ]
}

萌宠日记 选择 singleton 模式的原因:

  • 应用只需要一个主界面实例
  • 避免多个实例导致的数据冲突
  • 节省系统资源,降低内存占用
  • 符合移动端应用的常规使用习惯

总结

本文从 萌宠日记 的真实代码出发,详细解析了 UIAbility 生命周期 的六个核心阶段:onCreateonWindowStageCreateonForegroundonBackgroundonWindowStageDestroyonDestroy。每个阶段都有其特定的用途:

  1. onCreate:全局初始化,设置颜色模式
  2. onWindowStageCreate:加载 SplashPage 首屏
  3. onForeground:前台恢复准备
  4. onBackground:后台挂起处理
  5. onWindowStageDestroy:窗口资源清理
  6. onDestroy:全局资源释放

理解这些生命周期方法,能帮助你写出更健壮、更高效的 HarmonyOS 应用。

下一篇我们将深入 应用启动流程与闪屏页面设计,分析 SplashPage 的布局技巧和交互优化。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

相关推荐
Conan在掘金1 小时前
鸿蒙 ArkUI 组件深水区:Span 富文本嵌套,一行 Text 塞下「红蓝斜下大」五样式 + 动态高亮
后端
卷无止境1 小时前
Python 类型注解与运行时反射:从原理到工程实践
后端·python
耀耀_很无聊1 小时前
13_Spring Boot 3.5.8 + Redisson 3.45.1 导致 Sa-Token 登录 StackOverflowError
spring boot·后端·bootstrap
AskHarries1 小时前
邮件发送方案对比
后端
Ai拆代码的曹操2 小时前
@Async 注解失效的底层真相:this 调用绕过代理,接口响应翻倍
后端
l134062082352 小时前
HarmonyOS应用开发实战:小事记 - 多媒体文件上传:@ohos.net.http 的 multipart/form-data 请求构造
后端·华为·harmonyos·鸿蒙系统
小小猪的春天2 小时前
AI Code Review 例外决策框架:手动忽略警告之前,先回答4个问题
后端·架构
大卫陈2 小时前
微信小程序虚拟支付实战:从「支付能力被限制」到沙箱调通的全过程
前端·后端
武子康2 小时前
vLLM 0.25.1:服务没有报错,为什么仍会生成垃圾 Token(5 级正确性门禁 + 自动回滚条件)
前端·人工智能·后端