小白看 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.');
    });
  }
}

手绘风格对比图,左侧为错误做法(注释掉回调或提前调用),标注'窗口未就绪,UIContext/尺寸可

这段代码做了两件关键事:设置应用颜色模式,然后加载 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,
}

手绘风格信息图,列出 HarmonyOS Ability 关键生命周期节点:'onCreate'(全

跟随系统颜色模式后,这类组件在深浅色环境下更容易保持一致。

小白要记住的生命周期节点

你不用一开始背完整生命周期,先记这几个就够用:

  • onCreate:Ability 创建,做全局初始化;
  • onWindowStageCreate:窗口创建,加载页面;
  • onForeground:应用进入前台;
  • onBackground:应用进入后台;
  • onDestroy:Ability 销毁。

这个项目真正跟页面强相关的是 onWindowStageCreate

写在最后

看 HarmonyOS 项目别直接冲进页面文件。先看 Ability,你会知道页面怎么进来,窗口什么时候可用,工具类为什么能拿到上下文。下一篇我们进入主角:HdsTabs,看看底部悬浮页签是怎么搭出来的。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐