这篇从工程骨架切入先把入口、配置和状态约定讲清楚再落到用户能看到的页面效果。本篇主题是「Stage 模型入口EntryAbility 如何把应用带到首页」目标是把源码、效果和工程质量放到同一篇文章里讲透。本文是 21 天「智能相机开发实战」训练营第 2 天的第 1 篇。这篇解决什么问题读懂本篇能力在「双镜记忆相机」中的用户价值。从源码中定位关键入口而不是只停留在概念介绍。把页面效果、状态流转和失败态串成一个可复现的小闭环。代码来自哪里entry/src/main/ets/entryability/EntryAbility.etsentry/src/main/resources/base/profile/main_pages.json本篇优先阅读entry/src/main/ets/entryability/EntryAbility.ets下面的片段保留项目中的真实命名方便你在 DevEco Studio 中直接搜索。const WINDOW_WIDTH_STORAGE_KEY superImage.windowWidthPx; const WINDOW_HEIGHT_STORAGE_KEY superImage.windowHeightPx; const SAFE_AREA_TOP_STORAGE_KEY superImage.safeAreaTopPx; const SAFE_AREA_BOTTOM_STORAGE_KEY superImage.safeAreaBottomPx; const COLOR_MODE_STORAGE_KEY superImage.isDarkMode; export default class EntryAbility extends UIAbility { private currentWindowStage?: window.WindowStage; private windowSizeChangeCallback?: (windowSize: window.Size) void; private avoidAreaChangeCallback?: (data: window.AvoidAreaOptions) void; 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)); } this.updateColorModeStorage(this.context.config.colorMode); hilog.info(DOMAIN, testTag, %{public}s, Ability onCreate); } onDestroy(): void { hilog.info(DOMAIN, testTag, %{public}s, Ability onDestroy); } onWindowStageCreate(windowStage: window.WindowStage): void { // Main window is created, set main page for this ability hilog.info(DOMAIN, testTag, %{public}s, Ability onWindowStageCreate); this.currentWindowStage windowStage; this.updateColorModeStorage(this.context.config.colorMode); this.applyImmersiveWindow(windowStage); this.applySystemBarColors(windowStage); this.bindWindowMetrics(windowStage); windowStage.loadContent(pages/Index, (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.); }); } private applySystemBarColors(windowStage: window.WindowStage): void {源码拆解先看入口变量或函数它决定能力从哪个页面、哪个服务或哪个系统配置开始。再看状态字段页面上的按钮、提示、加载态通常不是临时文案而是这些状态的投影。最后看结果写回拍摄、定位、AI、同步或分享能力最终都要回到记录模型、页面刷新或用户反馈。跑出来是什么效果结合页面效果本文重点观察启动链路图首页启动截图生命周期源码截图flowchart LR A[配置入口] -- B[状态初始化] B -- C[页面构建] C -- D[用户可见效果]这张流程图可以直接放在文章中间用来解释「源码做了什么」和「用户看到了什么」之间的关系。截图则尽量截最终页面不只截调试日志。实操步骤在 DevEco Studio 打开项目先搜索本文列出的主文件。顺着源码片段中的变量或函数名继续查找调用点。真机或预览器运行到对应页面补一张成功态截图。主动制造一次失败态例如拒绝权限、断网、无数据或能力不支持。把成功态、失败态、源码片段和流程图组合成完整文章。工程质量点先画入口链路再讲局部实现读者不会迷路。状态字段按业务域分组讲解避免把 Index.ets 当成散乱变量清单。配置、资源和页面代码一起看才能解释最终效果。源码截图只截关键函数不截整屏代码方便读者跟着定位。效果图和流程图一一对应避免只讲原理却看不到用户结果。质量分自评维度分值本篇检查点源码准确度28/30代码片段来自项目文件变量名和函数名保持原样。效果可见性22/25页面效果与流程图能说明从点击到结果的路径。实操完整度19/20读者能按文章复现一个最小操作闭环。工程质量13/15覆盖失败态、状态边界或隐私边界中的关键点。表达清晰度10/10标题、截图说明和源码说明互相对齐。合计92/100达到训练营发布质量线。今日作业从本文列出的入口文件开始画一张你自己的调用链路图。找出一个可复用的状态字段说明它影响了哪些页面。补一张真机或预览器截图用来验证文章效果。完成作业后下一篇继续沿着同一条源码路径往下走先做出效果再把工程边界讲清楚。
第04篇|Stage 模型入口:EntryAbility 如何把应用带到首页
这篇从工程骨架切入先把入口、配置和状态约定讲清楚再落到用户能看到的页面效果。本篇主题是「Stage 模型入口EntryAbility 如何把应用带到首页」目标是把源码、效果和工程质量放到同一篇文章里讲透。本文是 21 天「智能相机开发实战」训练营第 2 天的第 1 篇。这篇解决什么问题读懂本篇能力在「双镜记忆相机」中的用户价值。从源码中定位关键入口而不是只停留在概念介绍。把页面效果、状态流转和失败态串成一个可复现的小闭环。代码来自哪里entry/src/main/ets/entryability/EntryAbility.etsentry/src/main/resources/base/profile/main_pages.json本篇优先阅读entry/src/main/ets/entryability/EntryAbility.ets下面的片段保留项目中的真实命名方便你在 DevEco Studio 中直接搜索。const WINDOW_WIDTH_STORAGE_KEY superImage.windowWidthPx; const WINDOW_HEIGHT_STORAGE_KEY superImage.windowHeightPx; const SAFE_AREA_TOP_STORAGE_KEY superImage.safeAreaTopPx; const SAFE_AREA_BOTTOM_STORAGE_KEY superImage.safeAreaBottomPx; const COLOR_MODE_STORAGE_KEY superImage.isDarkMode; export default class EntryAbility extends UIAbility { private currentWindowStage?: window.WindowStage; private windowSizeChangeCallback?: (windowSize: window.Size) void; private avoidAreaChangeCallback?: (data: window.AvoidAreaOptions) void; 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)); } this.updateColorModeStorage(this.context.config.colorMode); hilog.info(DOMAIN, testTag, %{public}s, Ability onCreate); } onDestroy(): void { hilog.info(DOMAIN, testTag, %{public}s, Ability onDestroy); } onWindowStageCreate(windowStage: window.WindowStage): void { // Main window is created, set main page for this ability hilog.info(DOMAIN, testTag, %{public}s, Ability onWindowStageCreate); this.currentWindowStage windowStage; this.updateColorModeStorage(this.context.config.colorMode); this.applyImmersiveWindow(windowStage); this.applySystemBarColors(windowStage); this.bindWindowMetrics(windowStage); windowStage.loadContent(pages/Index, (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.); }); } private applySystemBarColors(windowStage: window.WindowStage): void {源码拆解先看入口变量或函数它决定能力从哪个页面、哪个服务或哪个系统配置开始。再看状态字段页面上的按钮、提示、加载态通常不是临时文案而是这些状态的投影。最后看结果写回拍摄、定位、AI、同步或分享能力最终都要回到记录模型、页面刷新或用户反馈。跑出来是什么效果结合页面效果本文重点观察启动链路图首页启动截图生命周期源码截图flowchart LR A[配置入口] -- B[状态初始化] B -- C[页面构建] C -- D[用户可见效果]这张流程图可以直接放在文章中间用来解释「源码做了什么」和「用户看到了什么」之间的关系。截图则尽量截最终页面不只截调试日志。实操步骤在 DevEco Studio 打开项目先搜索本文列出的主文件。顺着源码片段中的变量或函数名继续查找调用点。真机或预览器运行到对应页面补一张成功态截图。主动制造一次失败态例如拒绝权限、断网、无数据或能力不支持。把成功态、失败态、源码片段和流程图组合成完整文章。工程质量点先画入口链路再讲局部实现读者不会迷路。状态字段按业务域分组讲解避免把 Index.ets 当成散乱变量清单。配置、资源和页面代码一起看才能解释最终效果。源码截图只截关键函数不截整屏代码方便读者跟着定位。效果图和流程图一一对应避免只讲原理却看不到用户结果。质量分自评维度分值本篇检查点源码准确度28/30代码片段来自项目文件变量名和函数名保持原样。效果可见性22/25页面效果与流程图能说明从点击到结果的路径。实操完整度19/20读者能按文章复现一个最小操作闭环。工程质量13/15覆盖失败态、状态边界或隐私边界中的关键点。表达清晰度10/10标题、截图说明和源码说明互相对齐。合计92/100达到训练营发布质量线。今日作业从本文列出的入口文件开始画一张你自己的调用链路图。找出一个可复用的状态字段说明它影响了哪些页面。补一张真机或预览器截图用来验证文章效果。完成作业后下一篇继续沿着同一条源码路径往下走先做出效果再把工程边界讲清楚。