摘要

Ability 是 OpenHarmony 应用的核心运行载体,分为 UIAbility(带界面页面)、ExtensionAbility(服务 / 弹窗 / 文件扩展)两类,应用冷启动、前后台切换、多页面管理、进程销毁全部依托 Ability 生命周期调度。API Version23 重构 UIAbility 前后台切换、窗口销毁、资源回收、多 Ability 栈管理底层逻辑,修复低版本切后台内存不释放、重复初始化、窗口卡死、多 Ability 跳转栈错乱、退出应用残留进程等兼容缺陷。旧项目升级 API23 后常出现:切后台再切回页面数据丢失、多次启动 Ability 重复创建窗口、退出应用进程未销毁、后台持续网络请求、全局变量反复重置等问题。本文基于 DevEco Studio API23 + 环境,区分 UIAbility 完整生命周期、前后台切换时序、应用冷启动流程、多 Ability 跳转、ExtensionAbility 基础规则,搭配启动初始化、前后台缓存数据、应用退出资源释放三大实战案例,输出进程资源回收、窗口管理规范,汇总版本升级故障解决方案,为鸿蒙完整应用架构开发提供底层标准模板。

关键词

OpenHarmony;API Version23;Ability;UIAbility;应用生命周期;前后台切换;进程资源回收;应用启动流程

一、引言

1.1 Ability 开发背景

ArkUI 页面只是 UIAbility 内部渲染的视图层,真正管控应用窗口、进程、全局初始化、后台运行、应用退出的载体是 UIAbility。所有页面路由、持久化初始化、全局网络监听、长连接、定时器都需要依托 UIAbility 生命周期统一管理,单纯页面aboutToAppear无法感知应用切后台、锁屏、进程销毁事件。

OpenHarmony API Version23 针对 Ability 底层进程调度引擎完成全面升级,核心变更:

  1. 标准化 UIAbility 完整生命周期执行顺序,冷启动 / 热启动 / 销毁时序严格区分,无乱序执行;
  2. 新增窗口内存自动回收机制,切后台闲置窗口自动释放视图资源;
  3. 强化 onWindowStageDestroy 销毁回调,强制释放全局长连接、定时器、网络请求;
  4. 规范多 UIAbility 任务栈隔离规则,不同 Ability 窗口互不干扰;
  5. 优化应用冷启动加载管线,区分主线程阻塞耗时逻辑,启动速度提升;
  6. 限制主线程 onCreate 执行大量 IO、数据库、网络请求,增加性能告警。

大量 API9~11 旧项目升级后,锁屏切后台定时器依旧运行、退出 APP 后台残留进程、重新打开应用数据全部重置,根源是未在 Ability 生命周期做全局资源管控,因此掌握 UIAbility 生命周期是完整项目底层架构必备技能。

1.2 开发环境与场景

开发工具:DevEco Studio 5.0+ 适配系统:OpenHarmony API Version23、HarmonyOS NEXT 开发语言:ArkTS 文件路径:entry/src/main/ets/entryability/EntryAbility.ets 测试场景:应用冷启动初始化全局配置、切后台保存临时数据、切前台刷新页面、锁屏 / 退出应用销毁全部资源、多 Ability 跨窗口跳转

二、API23+ UIAbility 完整生命周期与时序

2.1 五大核心生命周期回调(执行顺序固定)

  1. onCreate(want, launchParam) 应用进程第一次创建时执行,整个应用生命周期仅执行一次; 适用:全局工具初始化、AppStorage 默认值初始化、全局事件监听注册。
  2. onWindowStageCreate(windowStage) 窗口创建完成,加载主页面路由; 适用:加载 pages 首页、设置窗口背景、屏幕亮度、窗口适配。
  3. onForeground() 应用从后台切换至前台,用户可见; 适用:刷新首页数据、重启暂停的定时器、恢复网络轮询。
  4. onBackground() 应用切至后台(锁屏、切其他 APP、弹窗覆盖); 适用:暂停定时任务、暂停长轮询、将临时数据存入 Preferences。
  5. onWindowStageDestroy() 应用窗口销毁; 适用:关闭数据库、中断所有网络请求、清除全局定时器、解绑监听。
  6. onDestroy() 进程彻底销毁,APP 完全退出;仅彻底关闭应用时触发。

2.2 冷热启动时序区分

冷启动(APP 完全关闭,桌面点击图标打开)

onCreate → onWindowStageCreate → onForeground

热启动(APP 切后台,重新切回前台)

onBackground(切走时)→ onForeground(切回时) onCreate、onWindowStageCreate 不会重复执行

完全退出应用(返回键关闭全部页面 / 系统清理进程)

onBackground → onWindowStageDestroy → onDestroy

2.3 API23 强制约束与废弃规则

  1. 禁止在 onCreate 执行阻塞主线程的数据库、大文件 IO,移至异步子线程;
  2. 所有全局常驻资源(定时器、websocket、全局 http 轮询)必须在 onWindowStageDestroy 销毁;
  3. 多窗口多 UIAbility 各自拥有独立生命周期,互不共享窗口资源;
  4. 废弃旧版无窗口阶段直接加载页面写法,必须在 onWindowStageCreate 内 loadContent;
  5. onDestroy 无法保证 100% 执行(系统内存不足强杀进程),重要数据持久化必须在 onBackground 保存。

三、EntryAbility 标准基础模板(API23 通用)

ets

import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import type AbilityConstant from '@ohos.app.ability.AbilityConstant';
import type Want from '@ohos.app.ability.Want';
import type window from '@ohos.window';
import prefUtil from '../utils/preference_utils';
import rdbUtil from '../utils/rdb_util';
import AppStorage from '@ohos.arkui.state.AppStorage';

export default class EntryAbility extends UIAbility {
  // 全局定时器句柄,应用级定时任务
  globalTimer: number | null = null

  // 进程首次创建,全局初始化仅执行一次
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0001, "AbilityLog", "应用进程创建 onCreate");
    // 初始化全局默认状态
    AppStorage.SetOrCreate<boolean>("darkMode", false)
    AppStorage.SetOrCreate<boolean>("isLogin", false)
    AppStorage.SetOrCreate<string>("userName", "游客")
  }

  // 窗口创建,加载首页页面
  onWindowStageCreate(windowStage: window.WindowStage): void {
    hilog.info(0x0001, "AbilityLog", "窗口创建 onWindowStageCreate");
    // 获取全局上下文,初始化持久化与数据库
    const context = this.context
    prefUtil.init(context)
    rdbUtil.init(context)

    // 加载首页页面路由
    windowStage.loadContent("pages/index/index", (err) => {
      if (err.code) {
        hilog.error(0x0001, "AbilityLog", "页面加载失败 %s", JSON.stringify(err));
        return;
      }
    })

    // 开启全局定时轮询任务
    this.globalTimer = setInterval(() => {
      console.info("应用前台全局定时轮询");
    }, 10000)
  }

  // 应用切到前台,用户可见
  onForeground(): void {
    hilog.info(0x0001, "AbilityLog", "应用切前台 onForeground");
  }

  // 应用切后台(锁屏、切换其他应用)
  onBackground(): void {
    hilog.info(0x0001, "AbilityLog", "应用切后台 onBackground");
    // 后台暂停全局定时器,减少资源消耗
    if (this.globalTimer !== null) {
      clearInterval(this.globalTimer)
      this.globalTimer = null
    }
    // 后台自动保存临时全局配置到本地持久化
    let dark = AppStorage.Get<boolean>("darkMode")
    prefUtil.putBool("dark_mode", dark)
  }

  // 窗口销毁,释放全部资源
  onWindowStageDestroy(): void {
    hilog.info(0x0001, "AbilityLog", "窗口销毁 onWindowStageDestroy");
    // 兜底清除全局定时器
    if (this.globalTimer !== null) {
      clearInterval(this.globalTimer)
      this.globalTimer = null
    }
    // 关闭数据库释放文件锁
    rdbUtil.closeDB()
  }

  // 进程彻底销毁,APP完全退出
  onDestroy(): void {
    hilog.info(0x0001, "AbilityLog", "进程销毁 onDestroy");
  }
}

四、三大业务实战场景(API23 可直接落地)

4.1 实战一:冷启动全局初始化(读取本地配置回填 AppStorage)

需求:APP 打开自动读取 Preferences 保存的主题、登录状态,同步至全局内存,无需每个页面重复读取。

ets

// EntryAbility onCreate 仅初始化默认值
onCreate() {
  AppStorage.SetOrCreate("darkMode", false)
  AppStorage.SetOrCreate("isLogin", false)
}

// onWindowStageCreate 异步读取本地持久化覆盖全局状态
async onWindowStageCreate(windowStage: window.WindowStage) {
  const ctx = this.context
  await prefUtil.init(ctx)
  // 读取本地保存的深色模式
  let localDark = await prefUtil.getBool("dark_mode")
  AppStorage.Set("darkMode", localDark)
  // 读取登录缓存
  let isLogin = await prefUtil.getBool("is_login")
  AppStorage.Set("isLogin", isLogin)

  windowStage.loadContent("pages/index/index")
}

优势:所有页面打开直接读取 AppStorage,不用各自调用 Preferences 工具,统一初始化一次。

4.2 实战二:前后台切换资源管控(定时任务启停 + 后台自动存配置)

业务痛点:切后台定时器持续运行、频繁 IO 耗电、配置修改仅存内存,杀进程数据丢失。 解决方案:

  1. onForeground:恢复全局定时轮询;
  2. onBackground:暂停定时器,同步全局配置写入 Preferences 持久化;

ets

onForeground() {
  // 切回前台重启定时
  if(this.globalTimer === null) {
    this.globalTimer = setInterval(()=>{
      console.info("前台轮询刷新数据")
    }, 10000)
  }
}

onBackground() {
  // 后台停止定时,节省电量
  if(this.globalTimer) {
    clearInterval(this.globalTimer)
    this.globalTimer = null
  }
  // 内存配置落地磁盘,防止进程强杀丢失
  let dark = AppStorage.Get("darkMode")
  let name = AppStorage.Get("userName")
  prefUtil.putBool("dark_mode", dark)
  prefUtil.putString("user_name", name)
}

4.3 实战三:应用退出完整资源销毁,杜绝后台残留进程

需求:用户完全关闭 APP 时,关闭数据库、清除定时器、中断网络请求,无后台残留占用存储 / 网络。

ets

// 窗口销毁阶段统一释放所有重量级资源
onWindowStageDestroy() {
  // 1. 清除全局定时器
  if(this.globalTimer !== null) {
    clearInterval(this.globalTimer)
    this.globalTimer = null
  }
  // 2. 关闭RDB数据库,释放文件锁
  rdbUtil.closeDB()
  // 3. 可拓展:断开WebSocket、取消全局http轮询、注销事件监听
}

// onDestroy仅做轻量日志打印,不依赖其释放核心资源(系统可能不执行)
onDestroy() {
  hilog.info(0x0001, "AbilityLog", "应用进程彻底销毁");
}

API23 关键规范:不能依赖 onDestroy 释放资源,系统内存不足会直接强杀进程,onWindowStageDestroy 是窗口关闭必执行回调,所有资源统一在此销毁。

五、API23+ Ability 性能与内存优化规范

5.1 主线程执行规范

  1. onCreate、onWindowStageCreate 禁止同步阻塞 IO(大量数据库查询、大文件读取),全部封装 async 异步;
  2. 窗口 loadContent 后再执行耗时初始化,不阻塞页面渲染造成启动白屏;
  3. 全局定时任务间隔不小于 5s,切后台强制暂停,降低设备耗电。

5.2 数据持久化安全规范

  1. 易丢失配置(主题、昵称、开关)在 onBackground 自动写入 Preferences;
  2. 重要业务数据(笔记、表单)操作页面实时写入 RDB,不等待切后台统一保存;
  3. 冷启动统一从本地存储回填 AppStorage,保证重启配置不丢失。

5.3 资源回收强制规范

  1. 全局定时器、长连接、数据库实例统一在 onWindowStageDestroy 销毁;
  2. 页面内局部资源(页面定时器、单页请求)在页面 aboutToDisappear 销毁;
  3. 应用级全局资源统一 Ability 生命周期管控,分层管理避免内存泄漏。

5.4 多窗口多 Ability 规范

  1. 单应用常规仅使用一个 EntryAbility,多窗口场景新建独立 UIAbility;
  2. 不同 UIAbility 拥有独立 windowStage、独立生命周期,资源不共享;
  3. 跨 Ability 传参依靠 Want 携带简单参数,复杂数据通过 Preferences/AppStorage 中转。

六、API23 升级高频兼容问题与解决方案

问题 1:切后台再切回 APP,定时器依旧疯狂执行,耗电严重 解决:onBackground 清除全局定时器,onForeground 重新创建启动。

问题 2:退出 APP 重新打开,之前修改的主题、登录状态全部重置 解决:onWindowStageCreate 冷启动读取 Preferences 回填 AppStorage,onBackground 自动同步内存配置到本地。

问题 3:多次打开关闭应用,数据库提示文件被占用 解决:窗口销毁 onWindowStageDestroy 统一调用 rdbUtil.closeDB 释放数据库连接。

问题 4:onCreate 执行大量同步数据库操作,APP 启动长时间白屏卡顿 解决:数据库初始化改为异步 async,不阻塞主线程窗口加载。

问题 5:系统后台强杀进程,修改的配置全部丢失 解决:不要等待退出时保存,切后台 onBackground 实时持久化配置。

问题 6:多页面跳转退出全部页面,进程依旧后台残留占用内存 解决:窗口销毁回调彻底清除定时器、关闭数据库,释放全部重量级资源。

七、总结

UIAbility 是 OpenHarmony 应用底层运行核心,管控进程、窗口、全局资源、前后台切换完整生命周期,层级高于 ArkUI 页面组件生命周期。API Version23 标准化五大回调执行时序,区分冷热启动、前台后台、窗口销毁、进程销毁不同场景,明确全局资源初始化与销毁分界点,解决旧版本后台资源泄漏、配置丢失、进程残留、启动卡顿等问题。

项目标准分层资源管理方案:

  1. 应用全局资源(全局定时器、数据库、全局配置):UIAbility 生命周期管控;
  2. 单页面临时资源(页面请求、页面定时器):页面 aboutToAppear/aboutToDisappear 管控;
  3. 弹窗临时资源:CustomDialog 自身生命周期管控。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐