news 2026/6/4 18:09:22

【HarmonyOS实战】 UIAbility生命周期:应用是怎么“活“起来的?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【HarmonyOS实战】 UIAbility生命周期:应用是怎么“活“起来的?

文章目录

    • 前言
    • 一、UIAbility 是什么?
    • 二、EntryAbility 源码解析
    • 三、生命周期调用顺序
      • 3.1 应用冷启动(首次打开)
      • 3.2 应用退到后台
      • 3.3 应用从后台回到前台
      • 3.4 应用被销毁
    • 四、onCreate:应用初始化
      • 4.1 Want 是什么?
      • 4.2 setColorMode:强制亮色模式
    • 五、onWindowStageCreate:最重要的初始化时机
      • 5.1 设置全屏沉浸式
      • 5.2 读取安全区域高度
      • 5.3 监听安全区域变化
      • 5.4 加载主页面
    • 六、onForeground 和 onBackground
    • 七、生命周期方法对比(Android vs HarmonyOS)
    • 总结

前言

每个 HarmonyOS 应用都有一个"心脏",叫做UIAbility。应用的启动、进入前台、退到后台、被销毁,全都通过 UIAbility 的生命周期回调来管理。

项目里的EntryAbility.ets就是这个心脏的实现。这篇文章我们把它从头到尾解析清楚,让你彻底搞懂 HarmonyOS 应用是怎么"活"起来的。

项目预览

一、UIAbility 是什么?

在 HarmonyOS 中,Ability是应用的基本功能单元,分两种:

类型作用
UIAbility有 UI 界面的功能单元(我们用这个)
ExtensionAbility后台服务、输入法等无 UI 的扩展功能

每个 HarmonyOS 应用至少有一个UIAbility。对于简单的应用,通常只有一个EntryAbility;复杂的应用可能有多个 Ability(类似 Android 的多 Activity,但用法上更像多个"窗口")。

一句话:UIAbility 是应用窗口的管理者,页面(Page)在 UIAbility 内部运行。

二、EntryAbility 源码解析

完整的EntryAbility.ets

// entry/src/main/ets/entryability/EntryAbility.etsimport{AbilityConstant,ConfigurationConstant,UIAbility,Want}from'@kit.AbilityKit';import{hilog}from'@kit.PerformanceAnalysisKit';import{window}from'@kit.ArkUI';import{BusinessError}from'@kit.BasicServicesKit';constDOMAIN=0x0000;exportdefaultclassEntryAbilityextendsUIAbility{// ① 应用创建时调用(只调用一次)onCreate(want:Want,launchParam:AbilityConstant.LaunchParam):void{// 强制设置亮色模式this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT);hilog.info(DOMAIN,'testTag','%{public}s','Ability onCreate');}// ② 应用销毁时调用onDestroy():void{hilog.info(DOMAIN,'testTag','%{public}s','Ability onDestroy');}// ③ 窗口创建时调用(做初始化配置)onWindowStageCreate(windowStage:window.WindowStage):void{// 设置全屏沉浸式布局letwindowClass:window.Window=windowStage.getMainWindowSync();windowClass.setWindowLayoutFullScreen(true).then(()=>{hilog.info(0x0000,'testTag','Succeeded in setting the window layout to full-screen mode.');});// 获取并存储安全区域高度letavoidArea=windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR);AppStorage.setOrCreate('bottomRectHeight',avoidArea.bottomRect.height);avoidArea=windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);AppStorage.setOrCreate('topRectHeight',avoidArea.topRect.height);// 监听安全区域变化windowClass.on('avoidAreaChange',(data)=>{if(data.type===window.AvoidAreaType.TYPE_SYSTEM){AppStorage.setOrCreate('topRectHeight',data.area.topRect.height);}elseif(data.type===window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR){AppStorage.setOrCreate('bottomRectHeight',data.area.bottomRect.height);}});// 加载主页面windowStage.loadContent('pages/MainPage',(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');}}

三、生命周期调用顺序

3.1 应用冷启动(首次打开)

onCreate(want, launchParam) ↓ onWindowStageCreate(windowStage) ↓ [页面加载:loadContent('pages/MainPage')] ↓ onForeground() ↓ [用户使用应用...]

3.2 应用退到后台

[用户按Home键或切换应用] ↓ onBackground() ↓ [应用在后台存活,但可能被系统回收]

3.3 应用从后台回到前台

[用户重新打开应用] ↓ onForeground() ↓ [应用恢复,不再调用 onCreate]

3.4 应用被销毁

[系统回收 或 用户强制退出] ↓ onWindowStageDestroy() ↓ onDestroy()

四、onCreate:应用初始化

onCreate(want:Want,launchParam:AbilityConstant.LaunchParam):void{// 设置应用颜色模式为亮色this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT);hilog.info(DOMAIN,'testTag','%{public}s','Ability onCreate');}

4.1 Want 是什么?

Want是 HarmonyOS 中用于描述"启动意图"的对象,类似 Android 的Intent。它包含:

interfaceWant{bundleName?:string;// 应用包名abilityName?:string;// 目标 Ability 名称parameters?:Record<string,Object>;// 携带的自定义参数action?:string;// 动作类型// ... 更多字段}

通过want.parameters可以接收其他应用或系统传递过来的数据。

4.2 setColorMode:强制亮色模式

this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT);

这一行把整个应用强制设置为亮色模式,即使用户手机开了暗色模式,这个 App 也不跟着变暗。

为什么这样做?因为地图类应用通常有精心设计的配色方案,贸然跟随系统暗色模式可能导致 UI 不协调。这是一个主动的设计决策。

五、onWindowStageCreate:最重要的初始化时机

onWindowStageCreate是整个生命周期中最繁忙的方法,承担三项核心工作:

5.1 设置全屏沉浸式

letwindowClass:window.Window=windowStage.getMainWindowSync();windowClass.setWindowLayoutFullScreen(true);

setWindowLayoutFullScreen(true)让 UI 内容延伸到状态栏导航栏下方,实现沉浸式效果。这也意味着我们需要手动处理安全区域,避免内容被遮挡。

5.2 读取安全区域高度

// 导航栏高度letavoidArea=windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR);letbottomRectHeight=avoidArea.bottomRect.height;AppStorage.setOrCreate('bottomRectHeight',bottomRectHeight);// 状态栏高度avoidArea=windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);lettopRectHeight=avoidArea.topRect.height;AppStorage.setOrCreate('topRectHeight',topRectHeight);

获取顶部状态栏和底部导航条的实际高度(单位:px),存入全局AppStorage,后续页面用@StorageProp取出来,用于给内容区域设置对应的 padding,避免内容被系统 UI 遮挡。

5.3 监听安全区域变化

windowClass.on('avoidAreaChange',(data)=>{if(data.type===window.AvoidAreaType.TYPE_SYSTEM){AppStorage.setOrCreate('topRectHeight',data.area.topRect.height);}elseif(data.type===window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR){AppStorage.setOrCreate('bottomRectHeight',data.area.bottomRect.height);}});

为什么要监听变化?因为:

  • 折叠屏展开/折叠时,状态栏高度会变
  • 横竖屏切换时,安全区域也会变
  • 键盘弹出时,导航条高度可能变化

用监听器动态更新,保证AppStorage里的值始终是最新的。

5.4 加载主页面

windowStage.loadContent('pages/MainPage',(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.');});

这是最后一步,告诉窗口:加载pages/MainPage这个页面作为主页面。'pages/MainPage'对应的是entry/src/main/ets/pages/MainPage.ets(不需要写.ets后缀)。

六、onForeground 和 onBackground

这两个回调一般用于:

onForeground():void{// 应用进入前台时执行// 常见场景:// - 恢复网络连接// - 重新开始定位// - 刷新数据}onBackground():void{// 应用切到后台时执行// 常见场景:// - 暂停视频播放// - 保存未完成的状态// - 停止耗电操作}

这个项目的onForegroundonBackground只有日志,因为项目功能简单,地图和定位的生命周期由系统自动管理。

七、生命周期方法对比(Android vs HarmonyOS)

HarmonyOS(UIAbility)Android(Activity)触发时机
onCreateonCreate首次创建
onWindowStageCreateonStart/onResume之间窗口就绪
onForegroundonResume进入前台
onBackgroundonPause/onStop进入后台
onWindowStageDestroyonStop窗口销毁
onDestroyonDestroy彻底销毁

总结

EntryAbility.ets做了三件重要的事:

  1. onCreate:锁定亮色模式
  2. onWindowStageCreate:设置全屏沉浸、读取并监听安全区域高度、加载主页面
  3. onForeground/onBackground:处理前后台切换(本项目只记日志)

整个应用的启动流程是:onCreateonWindowStageCreate(设置全屏、存安全区域高度、加载页面)→onForeground(用户开始使用)。

下一篇详细讲沉浸式全屏布局——为什么要全屏,怎么处理状态栏遮挡问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 18:09:11

十秒音频能克隆声音吗?2026年5款免训练声音克隆工具深度解析

只有十秒音频&#xff0c;真的能克隆出高还原度的人声吗在短视频矩阵、有声书制作与数字人播客的实际业务中&#xff0c;配音往往是产能瓶颈。传统的 TTS&#xff08;文本转语音&#xff09;缺乏情感&#xff0c;而专业的声音克隆通常需要声优在录音棚录制几十分钟甚至数小时的…

作者头像 李华
网站建设 2026/6/4 18:08:48

效率提升秘籍:用快马生成的工具实现漫画链接批量自动化处理

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请生成一个用于提升漫画资源管理效率的工具页面代码。核心功能&#xff1a;1、提供一个文本域&#xff0c;允许用户批量粘贴多个jmcommic官网链接&#xff08;每行一个&#xff09…

作者头像 李华
网站建设 2026/6/4 18:08:31

压铸件清洗效率提升案例分析:表面活性剂的作用

压铸件表面残留的脱模剂、切削油和金属粉末混合形成厚重油污&#xff0c;清洗难度大、耗时长。某压铸厂&#xff08;主营新能源汽车电机壳体&#xff0c;材质ADC12&#xff09;原有清洗工艺存在效率瓶颈&#xff0c;单批次清洗耗时约40分钟&#xff0c;影响产线节拍。通过调整清…

作者头像 李华
网站建设 2026/6/4 18:04:06

到底为什么配置 Nginx 能影响 PHP 行为?

它的本质是&#xff1a;**Nginx 是 PHP 的 上游 (Upstream) 和 环境构建者 (Environment Builder)。 PHP 的被动性&#xff1a;PHP 脚本本身不知道 URL 是什么、客户端 IP 是多少、是否用了 HTTPS。它只知道读取 $_SERVER 数组。Nginx 的主动性&#xff1a;$_SERVER 里的绝大部…

作者头像 李华
网站建设 2026/6/4 18:04:02

三步部署B站成分检测器:五分钟让评论区用户身份一目了然

三步部署B站成分检测器&#xff1a;五分钟让评论区用户身份一目了然 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分&#xff0c;支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-checker 在…

作者头像 李华
网站建设 2026/6/4 18:02:59

基于树莓派与Flask的物联网气象监测系统:从传感器到Web可视化

1. 项目概述&#xff1a;打造你的专属气象站你是否曾对天气预报的准确性感到好奇&#xff0c;或者想亲手搭建一个属于自己的环境监测系统&#xff1f;在智能家居、小型温室种植或是工作室环境监控等场景下&#xff0c;一个能够实时、精准反馈本地微气候的设备&#xff0c;其价值…

作者头像 李华