《HarmonyOS技术精讲-窗口管理》第七篇:窗口事件处理与焦点管理 📅 2026/6/28 13:36:36 《HarmonyOS技术精讲-窗口管理》第七篇窗口事件处理与焦点管理事件响应与焦点掌握 HarmonyOS 窗口生命周期中的关键事件监听一、前言在 HarmonyOS 应用开发过程中窗口Window不仅仅是承载 UI 的容器它还负责管理应用与用户之间的交互状态。例如用户点击不同窗口时需要知道当前哪个窗口获得焦点应用进入后台时需要暂停视频播放、释放资源应用重新显示时需要恢复数据和刷新界面分屏、多窗口场景下需要根据窗口大小动态调整布局。这些场景都依赖窗口事件监听机制。HarmonyOS 提供了丰富的 Window 事件能力开发者可以通过监听窗口状态变化实现更加智能的交互体验。本文重点介绍三个常用窗口事件focusChange窗口焦点变化事件windowVisibilityChange窗口显示隐藏事件windowSizeChange窗口大小变化事件二、窗口事件处理基础在 HarmonyOS Stage 模型中我们通常通过WindowStage获取当前应用窗口。基本流程应用启动 → 创建 WindowStage → 获取 Window 对象 → 注册事件监听 → 响应窗口变化示例import{window}fromkit.ArkUI;import{UIAbility}fromkit.AbilityKit;exportdefaultclassEntryAbilityextendsUIAbility{onWindowStageCreate(windowStage:window.WindowStage){windowStage.getMainWindow().then((win){console.info(窗口创建成功);this.registerWindowListener(win);});}registerWindowListener(win:window.Window){console.info(开始监听窗口事件);}}获取到window.Window对象后就可以监听各种窗口状态变化。三、监听窗口焦点事件 focusChange1. 什么是窗口焦点焦点代表当前窗口是否处于用户交互状态。例如用户打开应用窗口获得焦点 → 接收用户输入 → 响应点击操作当用户打开其他窗口原窗口失去焦点 → 暂停交互在多窗口、悬浮窗场景中焦点管理非常重要。2. 监听焦点变化HarmonyOS 提供focusChange事件监听窗口焦点状态。win.on(focusChange,(isFocused){if(isFocused){console.info(当前窗口获得焦点);}else{console.info(当前窗口失去焦点);}});参数说明参数说明true窗口获得焦点false窗口失去焦点四、实战两个窗口焦点联动下面实现一个实际案例需求创建两个窗口窗口 A获得焦点时改变背景颜色窗口 B失去焦点时隐藏实现效果窗口 A 获得焦点 → 更新背景窗口 B 失去焦点 → 自动隐藏创建窗口管理类import{window}fromkit.ArkUI;exportclassWindowManager{privatemainWindow?:window.Window;privatesecondWindow?:window.Window;asyncinit(context){this.mainWindowawaitwindow.getLastWindow(context);this.registerMainWindowEvent();}registerMainWindowEvent(){this.mainWindow?.on(focusChange,(focus){if(focus){console.info(主窗口获得焦点);this.changeBackground();}});}changeBackground(){console.info(改变窗口背景颜色);}}第二窗口监听焦点secondWindow.on(focusChange,(focus){if(!focus){console.info(第二窗口失去焦点);secondWindow.hide();}});这种方式可以实现悬浮聊天窗口视频小窗工具面板多窗口协同五、监听窗口显示隐藏事件除了焦点变化窗口显示状态也是非常重要的生命周期事件。例如用户离开页面窗口隐藏 → 暂停动画 → 停止定位 → 释放资源用户返回窗口显示 → 恢复状态 → 加载数据监听代码win.on(windowVisibilityChange,(visible){if(visible){console.info(窗口显示);loadResource();}else{console.info(窗口隐藏);releaseResource();}});实际应用场景视频播放窗口隐藏functionreleaseResource(){console.info(暂停视频播放);}窗口显示functionloadResource(){console.info(恢复视频播放);}可以避免后台运行导致CPU 占用增加网络浪费电量消耗六、监听窗口大小变化事件 windowSizeChangeHarmonyOS 支持多种设备形态手机平板电脑折叠屏窗口尺寸可能动态变化。例如全屏 → 分屏 → 重新布局监听代码win.on(windowSizeChange,(size){console.info(窗口大小:${size.width}x${size.height});});七、根据窗口大小动态调整布局例如手机单列布局平板左右双栏布局代码win.on(windowSizeChange,(size){if(size.width600){console.info(切换手机布局);}else{console.info(切换平板布局);}});通过窗口尺寸变化可以实现自适应 UI横竖屏适配折叠屏适配八、完整窗口事件管理示例import{window}fromkit.ArkUI;exportclassAppWindowController{privatewin?:window.Window;init(win:window.Window){this.winwin;this.bindEvent();}bindEvent(){this.win?.on(focusChange,(focus){if(focus){console.info(窗口激活);}else{console.info(窗口暂停交互);}});this.win?.on(windowVisibilityChange,(visible){if(visible){this.resume();}else{this.pause();}});this.win?.on(windowSizeChange,(size){console.info(窗口尺寸变化,size.width,size.height);});}resume(){console.info(恢复资源);}pause(){console.info(释放资源);}}九、开发注意事项1. 及时移除监听长期监听可能导致资源泄漏。销毁时win.off(focusChange);2. 避免事件中执行耗时任务不要焦点变化 → 大量数据加载 → 页面卡顿推荐焦点变化 → 异步任务 → 更新状态3. 不要假设窗口创建后一定获得焦点多窗口环境下创建窗口 ≠ 获得焦点应该通过focusChange实时判断。十、总结本篇学习了 HarmonyOS 窗口事件管理。核心知识点focusChange监听窗口焦点变化。适用于用户交互控制多窗口协同悬浮窗管理windowVisibilityChange监听窗口显示隐藏。适用于生命周期管理资源释放数据恢复windowSizeChange监听窗口大小变化。适用于分屏适配折叠屏适配多设备布局掌握窗口事件监听后可以让 HarmonyOS 应用在不同设备形态和复杂交互场景下保持稳定运行。示例代码项目地址项目地址