HarmonyOS鸿蒙Next中window实例在手机App开发上的应用

HarmonyOS鸿蒙Next中window实例在手机App开发上的应用 什么情况下需要创建一个window呢?我怎么感觉在手机App开发上基本没用过window实例啊

8 回复

90%以上的手机 App 开发,确实几乎不会主动创建 Window。

因为在 Stage 模型下:

UIAbility
    ↓
WindowStage
    ↓
MainWindow
    ↓
ArkUI页面

系统已经帮你创建好了主窗口。你平时写的:

windowStage.loadContent(...)
router.pushUrl(...)
Navigation(...)

其实都是在这个主窗口里面切页面。

所以很多开发者做了几年业务,可能都没手动创建过 Window。


真正需要 Window 的场景主要有这几个:

1. 应用内悬浮窗

例如:

  • 音乐播放器悬浮歌词
  • 全局悬浮按钮
  • 悬浮工具球
  • 调试面板

这种一般会创建 SubWindow。


2. 独立弹窗显示

普通 Dialog:

CustomDialog
AlertDialog

就够了。

但如果希望弹窗脱离当前页面层级:

主页面
    ↑
独立悬浮窗口

就会用子窗口。


3. 多窗口场景

例如:

  • 折叠屏
  • 平板
  • PC版鸿蒙应用

可能同时存在多个窗口。

这时候 Window API 就很重要了。


4. 控制系统窗口属性

虽然不创建 Window,但经常会拿 Window 实例:

windowStage.getMainWindowSync()

然后做:

全屏
沉浸式
状态栏隐藏
导航栏隐藏
窗口尺寸控制
亮度控制

这个在项目里反而比较常见。


所以对于普通手机 App:

页面跳转
列表展示
表单录入
网络请求

基本不用自己创建 Window。

真正会碰到 Window 的,往往是:

悬浮窗
画中画
多窗口
桌面应用
折叠屏
PC应用
系统级交互

如果你主要做手机业务 App,你觉得“好像从来没用过 Window”,这个感觉其实是正常的。大多数开发者真正接触 Window API,都是从做悬浮窗或者沉浸式页面开始的。

更多关于HarmonyOS鸿蒙Next中window实例在手机App开发上的应用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


背景知识:

  • 手机普通 App(页面跳转、列表、表单)确实很少自己 new Window,因为系统 / 框架已经帮你把 “主窗口” 做好了;只有要做「全局悬浮、系统级弹窗、独立小窗、沉浸式 / 全屏、多窗口」时,才需要手动拿 Window 或创建子窗口。

在鸿蒙 / 安卓里:

  • 你写的每个页面(.ets),都自动挂在系统给你创建的「主窗口(Main Window)」。
  • UIAbility 启动时,系统自动:
  • 创建 WindowStage → 2. 创建主 Window → 3. 把你的页面 load 到这个 Window 里。
  • 日常写 @Entry @Component、路由跳转、页面布局,都在这个主 Window 里玩,不需要你手动创建 Window

所以:普通 App 开发,90% 场景确实不用自己碰 Window 实例。

下面是手动操作 Window / 创建子窗口:

1、全局悬浮窗(像微信 / 音乐播放器那种小浮球)

  • 特点:跨页面、不依赖当前页面、永远在最上层、可拖动。
  • 实现:必须用 windowStage.createSubWindow() 创建一个独立 Window,挂到 WindowStage 上。

2、系统级弹窗 / 全局对话框(覆盖所有页面)

  • 比如:App 更新强提醒、全局登录弹窗、跨页面确认框。
  • 普通 AlertDialog 是 “页面内弹窗”,切页就没了;要全局有效,必须做子窗口。

3、浸式 / 全屏(隐藏状态栏、导航栏,且全局生效)

  • 游戏、视频、阅读类 App 常用。
  • 页面内可以用 expandSafeArea,但全局统一沉浸,必须在 Ability 里拿到主 Window 并设置:
// EntryAbility.ets
onWindowStageCreate(windowStage: WindowStage) {
  let mainWindow = windowStage.getMainWindowSync();
  mainWindow.setWindowLayoutFullScreen(true); // 全局沉浸
}

更多的是View/UIView、ViewController/Activity等,它们已经和Window很好地集成在一起了。我们只需要把自己的内容通过 setContentView() 或者 addSubview() 等方法添加到这些容器上,框架会负责把它们正确地呈现在Window上。

有的,我记得云闪付就有。
要实现类似安卓的小程序后台,也是通过这个实现的,只不过现在鸿蒙微信团队是 ios 那波人,不乐意做

手机 App 里大多数页面确实不用自己创建新的 window,因为主 UIAbility 已经有一个主窗口,普通页面路由、弹窗、半模态都在这个主窗口里完成。window 实例更多用于需要控制窗口级属性或特殊窗口形态的场景。

常见使用点包括:设置状态栏/导航栏颜色和沉浸式布局、获取窗口尺寸和安全区、监听窗口大小变化、设置屏幕常亮、处理分屏/自由窗口适配、创建子窗口/悬浮类窗口等。日常业务页面如果只是跳转页面、显示 Dialog、Toast、Sheet,就不需要额外创建 window;但在 EntryAbility 里拿主窗口做全局外观和响应式初始化,是比较常见的。

在手机上这块的能力限制比较多,基本没啥用。

PC应用使用的多吧,

在 HarmonyOS Next 手机 App 开发中,绝大多数场景不需要手动创建 Window 实例。系统会在 Ability 启动时自动为主界面创建并管理主窗口,通过 WindowStage 提供 loadContent 等接口加载页面即可满足常规 UI 需求。

仅在需要系统级悬浮窗、分屏中主动打开新窗口、或实现画中画等特殊多窗口交互时,才需要调用 window.createWindow 显式创建 Window 实例。这些场景已超出普通应用范围,日常业务开发几乎不会涉及。

回到顶部