HarmonyOS鸿蒙Next中window实例在手机App开发上的应用
HarmonyOS鸿蒙Next中window实例在手机App开发上的应用 什么情况下需要创建一个window呢?我怎么感觉在手机App开发上基本没用过window实例啊
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 实例。这些场景已超出普通应用范围,日常业务开发几乎不会涉及。

