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/10/25 14:47:43 阅读更多 →
DeepSeek V4.1大模型代码能力升级解析与应用实践

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

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

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

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

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

2026/10/24 21:37:49 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/25 11:19:54 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/25 22:36:10 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/25 10:02:42 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/26 5:00:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/26 3:16:46 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 10:02:43 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →