HarmonyOs应用《重要日》开发第19篇 - EntryAbility 应用入口与生命周期管理
本文深入解析 ImportantDays 项目中的应用入口EntryAbility包括 UIAbility 的生命周期回调、初始化流程Preferences → Manager → 通知检查、窗口管理、前台提醒检查机制以及应用配置的关联关系。一、UIAbility 概述UIAbility是 HarmonyOS 应用的基本组成单元负责承载 UI 界面和处理生命周期。每个应用至少有一个 UIAbility 作为入口。应用启动 ↓ EntryAbility.onCreate() ↓ EntryAbility.onWindowStageCreate() ↓ 加载 MainEntry 页面 ↓ 用户交互 ↓ EntryAbility.onForeground() / onBackground() ↓ EntryAbility.onWindowStageDestroy() ↓ EntryAbility.onDestroy()二、EntryAbility 完整代码import{UIAbility,AbilityConstant,Want}fromkit.AbilityKit;import{window}fromkit.ArkUI;import{PreferenceUtil}from../utils/PreferenceUtil;import{NotificationUtil}from../utils/NotificationUtil;import{ImportantDayManager}from../viewmodel/ImportantDayManager;exportdefaultclassEntryAbilityextendsUIAbility{asynconCreate(want:Want,launchParam:AbilityConstant.LaunchParam):Promisevoid{console.info(EntryAbility onCreate);PreferenceUtil.init(this.context);ImportantDayManager.getInstance().init();consthasPermissionawaitNotificationUtil.checkPermission();if(hasPermission){awaitImportantDayManager.getInstance().checkAndSendReminders();}}onNewWant(want:Want,launchParam:AbilityConstant.LaunchParam):void{console.info(EntryAbility onNewWant);}onDestroy():void{console.info(EntryAbility onDestroy);}onWindowStageCreate(windowStage:window.WindowStage):void{console.info(EntryAbility onWindowStageCreate);windowStage.getMainWindow((err,win){if(err.code){console.error(Failed to get main window:,err);return;}// 沉浸式设置已注释});windowStage.loadContent(pages/MainEntry,(err){if(err.code){console.error(Failed to load content:,err);return;}console.info(Loaded MainEntry successfully);});}onWindowStageDestroy():void{console.info(EntryAbility onWindowStageDestroy);}onForeground():void{console.info(EntryAbility onForeground);ImportantDayManager.getInstance().checkAndSendReminders();}onBackground():void{console.info(EntryAbility onBackground);}}三、生命周期回调详解onCreateasynconCreate(want:Want,launchParam:AbilityConstant.LaunchParam):Promisevoid{console.info(EntryAbility onCreate);PreferenceUtil.init(this.context);ImportantDayManager.getInstance().init();consthasPermissionawaitNotificationUtil.checkPermission();if(hasPermission){awaitImportantDayManager.getInstance().checkAndSendReminders();}}调用时机Ability 实例首次创建时应用冷启动。执行流程1. PreferenceUtil.init(this.context) ↓ 初始化 Preferences 存储 2. ImportantDayManager.getInstance().init() ↓ 加载持久化数据 ↓ 构建 dayMap ↓ 检查并发送提醒 3. NotificationUtil.checkPermission() ↓ 检查通知权限 4. 如果有权限 → checkAndSendReminders() ↓ 发送到期提醒初始化顺序的重要性PreferenceUtil.init() ← 必须最先执行 ↓ ImportantDayManager.init() 依赖 PreferenceUtil ↓ Manager.init() 调用 PreferenceUtil.loadImportantDays()如果顺序反了PreferenceUtil.store为 null数据加载失败。onNewWantonNewWant(want:Want,launchParam:AbilityConstant.LaunchParam):void{console.info(EntryAbility onNewWant);}调用时机Ability 已存在实例通过 WantAgent 或其他方式再次启动时。场景用户点击通知打开应用但应用已在后台运行。当前实现仅打印日志未来可在此解析 Want 携带的参数实现精确跳转。onDestroyonDestroy():void{console.info(EntryAbility onDestroy);}调用时机Ability 实例被销毁时。当前实现仅打印日志数据已在每次操作时持久化无需额外处理。onWindowStageCreateonWindowStageCreate(windowStage:window.WindowStage):void{console.info(EntryAbility onWindowStageCreate);windowStage.getMainWindow((err,win){if(err.code){console.error(Failed to get main window:,err);return;}// win.setWindowLayoutFullScreen(true);// win.setWindowSystemBarProperties({ ... });});windowStage.loadContent(pages/MainEntry,(err){if(err.code){console.error(Failed to load content:,err);return;}console.info(Loaded MainEntry successfully);});}调用时机窗口舞台创建时onCreate 之后。执行流程获取主窗口windowStage.getMainWindow()当前沉浸式设置已注释预留功能加载主页面windowStage.loadContent(pages/MainEntry)加载MainEntry作为入口页面MainEntry使用 Tabs 组织三个 Tab 页面onWindowStageDestroyonWindowStageDestroy():void{console.info(EntryAbility onWindowStageDestroy);}调用时机窗口舞台销毁时应用被关闭。onForegroundonForeground():void{console.info(EntryAbility onForeground);ImportantDayManager.getInstance().checkAndSendReminders();}调用时机应用从后台回到前台时。核心功能每次回到前台都检查提醒确保用户不会错过在后台期间到期的提醒。onBackgroundonBackground():void{console.info(EntryAbility onBackground);}调用时机应用从前台进入后台时。当前实现仅打印日志。四、完整生命周期时序冷启动应用未运行 ↓ onCreate() ↓ 初始化数据 onWindowStageCreate() ↓ 加载页面 onForeground() ↓ 检查提醒 用户交互热启动从后台恢复应用在后台 ↓ 用户点击应用图标 / 通知 ↓ onForeground() ↓ 检查提醒 用户交互通知点击启动通知显示 ↓ 用户点击通知 ↓ WantAgent 触发 ↓ 应用已在运行 ├── 是 → onNewWant() → onForeground() └── 否 → onCreate() → onWindowStageCreate() → onForeground()退出应用用户退出 ↓ onBackground() ↓ onWindowStageDestroy() ↓ onDestroy()五、初始化流程详解第一步Preferences 初始化PreferenceUtil.init(this.context);this.contextAbility 的上下文用于确定存储路径PreferenceUtil.init使用getPreferencesSync同步创建 Preferences 实例必须在ImportantDayManager.init()之前执行第二步数据管理器初始化ImportantDayManager.getInstance().init();init()内部执行init():void{if(this.initialized)return;this.allDaysPreferenceUtil.loadImportantDays();// 依赖 Preferencesthis.rebuildDayMap();this.initializedtrue;this.checkAndSendReminders();// 初始化时也检查提醒}注意init()内部已经调用了checkAndSendReminders()但此时可能没有通知权限。第三步权限检查与提醒consthasPermissionawaitNotificationUtil.checkPermission();if(hasPermission){awaitImportantDayManager.getInstance().checkAndSendReminders();}由于init()中的checkAndSendReminders()可能在没有权限时执行这里再次检查权限并调用确保有权限时一定发送提醒。双重检查的设计考量// init() 内部的检查可能无权限this.checkAndSendReminders();// ↓ checkAndSendReminders 内部也检查权限// ↓ if (!hasPermission) return;// onCreate 中的显式检查consthasPermissionawaitNotificationUtil.checkPermission();if(hasPermission){awaitImportantDayManager.getInstance().checkAndSendReminders();}实际上checkAndSendReminders()内部已有权限检查onCreate中的显式检查是冗余的。但这种双重检查确保了可靠性——即使内部检查逻辑发生变化外部检查仍然保障。六、窗口管理获取主窗口windowStage.getMainWindow((err,win){if(err.code){console.error(Failed to get main window:,err);return;}// 沉浸式设置已注释});沉浸式状态栏预留/*win.setWindowLayoutFullScreen(true); win.setWindowSystemBarProperties({ statusBarContentColor: #333333, navigationBarContentColor: #333333 });*/这段代码被注释了但保留了沉浸式全屏的方案setWindowLayoutFullScreen(true)设置全屏布局setWindowSystemBarProperties设置状态栏和导航栏文字颜色加载主页面windowStage.loadContent(pages/MainEntry,(err){if(err.code){console.error(Failed to load content:,err);return;}console.info(Loaded MainEntry successfully);});pages/MainEntry对应MainEntry.ets文件中的Entry组件。七、与 module.json5 的关联{module:{mainElement:EntryAbility,abilities:[{name:EntryAbility,srcEntry:./ets/entryability/EntryAbility.ets,skills:[{entities:[entity.system.home],actions:[action.system.home]}]}]}}配置说明字段值说明mainElementEntryAbility应用入口 AbilitysrcEntry./ets/entryability/EntryAbility.ets源文件路径skillsentity.system.homeaction.system.home声明可从桌面启动WantAgent 与配置的对应// WantAgent 中的配置{bundleName:com.importantdays.app,abilityName:EntryAbility,action:action.system.home}必须与app.json5的bundleName和module.json5的abilities[0].name一致。八、前台提醒检查机制为什么每次回前台都检查场景 1. 用户早上 8 点打开应用设置了一个 3 天后提醒的重要日 2. 用户退出应用 3. 三天后重要日进入提醒范围 4. 用户下午 2 点打开应用 5. onForeground → checkAndSendReminders → 发送通知鸿蒙应用在后台时无法主动发送通知除非使用后台任务因此每次回到前台时检查是务实的解决方案。检查逻辑asynccheckAndSendReminders():Promisevoid{constneedReminderthis.getDaysNeedReminder();// needReminder 所有 shouldRemind() 返回 true 的重要日consthasPermissionawaitNotificationUtil.checkPermission();if(!hasPermission)return;for(constdayofneedReminder){consttitleday.isToday()?今天${day.title}:即将到来${day.title};constcontentday.getDisplayText();awaitNotificationUtil.publishBasic(title,content,this.getNotificationId(day.dayID));}}重复通知问题每次回前台都会发送通知可能导致重复通知。但由于使用稳定的通知 ID基于 dayID 哈希相同 ID 的通知会覆盖而非追加。九、总结EntryAbility的设计体现了以下原则初始化有序Preferences → Manager → 通知检查依赖关系清晰生命周期完整所有回调都有实现即使只是日志前台检查每次回前台检查提醒确保不遗漏错误处理窗口加载和内容加载都有错误检查配置一致与 app.json5 和 module.json5 保持对应EntryAbility是应用的入口点它的正确初始化是整个应用正常运行的基石。

相关新闻

SolidWorks_钣金设计18_钣金工程图规范

SolidWorks_钣金设计18_钣金工程图规范

钣金工程图规范:标注展开图、折弯线、折弯角度及下料尺寸的完整指南 摘要 钣金工程图是连接设计意图与制造工艺的核心技术文档。本文系统性地阐述了钣金工程图的规范标注方法,重点涵盖展开图的绘制与标注、折弯线的精确表达、折弯角度的标准标注以及下料…

2026/7/24 4:29:19 阅读更多 →
DeepSeek V4.1大模型代码能力升级解析与应用实践

DeepSeek V4.1大模型代码能力升级解析与应用实践

1. DeepSeek V4.1版本的技术升级解析DeepSeek作为国内领先的大模型研发团队,其最新发布的V4.1版本在代码能力方面实现了超过40%的性能提升,这一突破性进展引起了开发者社区的广泛关注。从技术架构来看,此次升级主要集中在三个核心维度&#x…

2026/7/24 5:24:09 阅读更多 →
Claude头脑风暴实战指南:7步构建高产创意工作流,附可立即复用的12个行业模板

Claude头脑风暴实战指南:7步构建高产创意工作流,附可立即复用的12个行业模板

更多请点击: https://codechina.net 第一章:Claude头脑风暴辅助 Claude 作为一款以长文本理解与逻辑推理见长的大语言模型,特别适合在创意发散、方案设计与问题拆解等头脑风暴场景中充当“思维协作者”。其强项在于深度追问、多角度重构问题…

2026/7/24 6:00:45 阅读更多 →

最新新闻

PCA+聚类+UMAP:高维数据分析与可视化的完整技术指南

PCA+聚类+UMAP:高维数据分析与可视化的完整技术指南

这次我们来看一个数据分析中非常实用的技术组合:PCA 聚类 UMAP 可视化。这个组合特别适合处理高维数据,比如基因表达数据、用户画像数据或者任何特征维度超过几十个的数据集。 很多人在面对高维数据时会遇到几个典型问题:特征太多导致计算…

2026/7/25 1:58:19 阅读更多 →
网易后端面试全解析:从八股文到系统设计的通关秘籍

网易后端面试全解析:从八股文到系统设计的通关秘籍

这次我们来看一个211本科同学面试网易后端岗位的真实经历。这位同学经历了4轮面试,从简历筛选、笔试、技术面到HR面,整个过程可以说是被“拷打”到怀疑人生。但最终的结果如何?是拿到了Offer,还是遗憾收场?更重要的是&…

2026/7/25 1:58:19 阅读更多 →
AI辅助诊断在主动脉夹层CT影像分析中的应用与优化

AI辅助诊断在主动脉夹层CT影像分析中的应用与优化

1. 项目背景与临床需求主动脉疾病是血管外科领域的重大挑战,其中主动脉夹层因其高死亡率备受关注。在急诊场景下,快速准确地区分真假腔直接关系到手术方案的制定。传统上,放射科医生需要手动逐层标注CT影像,这个过程往往需要30-45…

2026/7/25 1:58:19 阅读更多 →
C++实现十六进制转十进制:从原理到实战的完整指南

C++实现十六进制转十进制:从原理到实战的完整指南

1. 项目概述:从十六进制到十进制的跨越在嵌入式开发、逆向工程、网络协议分析甚至是游戏内存修改这些领域,我们经常会遇到一串串以0x开头或者由0-9和A-F组成的“神秘代码”。这些就是十六进制数。对于习惯了十进制(逢十进一)的人类…

2026/7/25 1:58:19 阅读更多 →
C++实现DEM内插与登高线生成:从算法原理到工程实践

C++实现DEM内插与登高线生成:从算法原理到工程实践

1. 项目概述:从DEM到登高线的核心价值在地理信息、测绘工程乃至游戏地形生成领域,数字高程模型(DEM)都是描述地表形态的基石。但原始DEM数据往往是一系列离散的高程点,如何从中提取出直观、连续的地形特征线——登高线…

2026/7/25 1:58:19 阅读更多 →
Wan2.2工作流实战:从环境搭建到AI视频生成全流程解析

Wan2.2工作流实战:从环境搭建到AI视频生成全流程解析

最近在AI视频生成领域,Wan2.2工作流因其出色的画面稳定性和生成质量备受关注。很多开发者尝试部署时却卡在环境配置、工作流加载和参数调优环节,特别是面对闪烁、画面撕裂等常见问题缺乏系统解决方案。本文将完整拆解Wan2.2工作流从环境搭建到高级应用的实战流程,包含文生视…

2026/7/25 1:57:18 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻