HarmonyOS7 从 EntryAbility 看智感握姿页面是怎么启动的
小白看 HarmonyOS 项目,最容易被一堆目录绕晕。其实你只要先抓住 EntryAbility,就能知道应用从哪里启动、页面什么时候加载、窗口工具什么时候初始化。
项目源码:https://gitcode.com/HarmonyOS_Samples/SmartReach/tree/master
入口不是 MainPage,而是 Ability
MainPage.ets 是页面没错,但它不是应用启动的第一站。真正先被系统拉起来的是 EntryAbility.ets。
这个文件在:entry/src/main/ets/entryability/EntryAbility.ets。
看核心代码:
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
try {
this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
} catch (err) {
Logger.error(TAG, `Failed to set colorMode. Cause: ${err.message}`);
}
Logger.info(TAG, 'Ability onCreate');
}
onWindowStageCreate(windowStage: window.WindowStage): void {
Logger.info(TAG, 'Ability onWindowStageCreate');
windowStage.loadContent('pages/MainPage', (err) => {
if (err?.code) {
Logger.error(TAG, `Failed to load the content. Cause: ${err.message}`);
return;
}
WindowUtil.initialize(windowStage);
Logger.info(TAG, 'Succeeded in loading the content.');
});
}
}

这段代码做了两件关键事:设置应用颜色模式,然后加载 pages/MainPage。
为什么先加载页面,再初始化 WindowUtil
注意这一行:
windowStage.loadContent('pages/MainPage', (err) => {
WindowUtil.initialize(windowStage);
});
WindowUtil.initialize() 放在 loadContent 的回调里,说明它依赖窗口和 UI 上下文已经准备好。这个顺序很重要。
WindowUtil 后面要拿 UIContext、窗口尺寸、安全区信息,如果窗口还没准备好,拿到的东西就可能是空的。
智感握姿为什么关心窗口
这个项目不是只在手机上跑,它还要适配折叠屏和平板。窗口尺寸、安全区、断点都会影响底部悬浮页签的位置。
入口里初始化 WindowUtil,就是为了让后续页面可以通过全局状态拿到这些信息。
大概链路是这样:
onWindowStageCreate
-> loadContent('pages/MainPage')
-> WindowUtil.initialize(windowStage)
-> 获取窗口尺寸和安全区
-> 写入 GlobalInfoModel
-> MainPage / WaterFlowView 读取并适配布局
这条链路理解了,后面看 AppStorageV2 就不会懵。
颜色模式设置也有用
示例里还有一段:
this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
它表示应用不强行指定亮色或暗色,而是跟随系统。对于使用系统颜色资源、系统材质效果的页面,这样更自然。
比如 HdsTabs 里用了系统材质:
systemMaterialEffect: {
materialType: hdsMaterial.MaterialType.ADAPTIVE,
materialLevel: hdsMaterial.MaterialLevel.ADAPTIVE,
}

跟随系统颜色模式后,这类组件在深浅色环境下更容易保持一致。
小白要记住的生命周期节点
你不用一开始背完整生命周期,先记这几个就够用:
onCreate:Ability 创建,做全局初始化;onWindowStageCreate:窗口创建,加载页面;onForeground:应用进入前台;onBackground:应用进入后台;onDestroy:Ability 销毁。
这个项目真正跟页面强相关的是 onWindowStageCreate。
写在最后
看 HarmonyOS 项目别直接冲进页面文件。先看 Ability,你会知道页面怎么进来,窗口什么时候可用,工具类为什么能拿到上下文。下一篇我们进入主角:HdsTabs,看看底部悬浮页签是怎么搭出来的。
更多推荐



所有评论(0)