1# 窗口子系统变更说明 2 3## cl.window.1 在2in1设备上getWindowStatus和on('windowStatusChange')接口在窗口最大化状态返回值变更 4 5**访问级别** 6 7公开接口 8 9**变更原因** 10 11getWindowStatus和on('windowStatusChange') 接口在最大化状态返回值为 WindowStatusType::FULL_SCREEN,与实际情况不符合。 12 13应用无法直接通过这两个接口在2in1设备上区分当前最大化和全屏状态,与接口功能设计不符合。 14 15**变更影响** 16 17该变更为不兼容变更。 18 19变更前:2in1设备上调用getWindowStatus和on('windowStatusChange') 接口,在最大化状态返回值为WindowStatusType::FULL_SCREEN。 20 21变更后:2in1设备上调用getWindowStatus和on('windowStatusChange') 接口,在最大化状态返回值为WindowStatusType::MAXIMIZE。 22 23**起始 API Level** 24 25on('windowStatusChange')接口从API version 11开始支持 26 27在2in1设备上getWindowStatus接口从API version 12开始支持 28 29**变更发生版本** 30 31从OpenHarmony SDK 5.0.1.45开始。 32 33**变更的接口/组件** 34 35@ohos.window.d.ts 36 37系统能力:SystemCapability.Window.SessionManager 38 39接口:getWindowStatus、on('windowStatusChange') 40 41**适配指导** 42 43针对2in1设备上想要区分当前窗口最大化状态和全屏状态的场景,在变更前后的实现方案分别如下: 44 45- API version 13及之前的版本,可以在窗口状态为WindowStatusType::FULL_SCREEN的情况下,再调用[getImmersiveModeEnabledState()](../../../application-dev/reference/apis-arkui/js-apis-window.md#getimmersivemodeenabledstate12) 接口进行进一步判断,到底是最大化状态还是全屏状态。若接口返回true则表示当前窗口为全屏状态,若接口返回false则表示当前窗口为最大化状态。 46 47- API version 14及之后的版本,可以直接调用getWindowStatus、on('windowStatusChange')接口区分窗口最大化和全屏状态。 48 49 不过需要注意返回值的变更和代码适配:若应用针对WindowStatusType::FULL_SCREEN 和 WindowStatusType::MAXIMIZE状态的代码处理逻辑相同,则在对应的逻辑处理时,直接追加WindowStatusType::MAXIMIZE判断条件(条件或)即可;若应用针对WindowStatusType::FULL_SCREEN和 WindowStatusType::MAXIMIZE状态有不同的处理逻辑,则需要增加新的WindowStatusType::MAXIMIZE条件判断分支中进行窗口最大化状态相关逻辑的处理。 50 51以下示例以on('windowStatusChange') 接口为例,提供变更前后2in1设备上区分当前窗口最大化状态和全屏状态的指导和适配示例: 52 53API version 13及之前版本区分最大化状态示例: 54```ts 55// EntryAbility.ets 56import { BusinessError } from '@kit.BasicServicesKit'; 57 58export default class EntryAbility extends UIAbility { 59 // ... 60 onWindowStageCreate(windowStage: window.WindowStage) { 61 console.info('onWindowStageCreate'); 62 try { 63 let windowClass = windowStage.getMainWindowSync(); 64 windowClass?.on("windowStatusChange", (windowStatusType: window.WindowStatusType) => { 65 if (windowStatusType == window.WindowStatusType.FULL_SCREEN) { 66 // isFullScreen 为true 表示全屏,为false 表示最大化 67 let isFullScreen: boolean = windowClass.getImmersiveModeEnabledState(); 68 } else { 69 // ... 70 } 71 }) 72 } catch (exception) { 73 console.error(`Failed to obtain the main window. Cause code: ${exception.code}, message: ${exception.message}`); 74 } 75 } 76} 77``` 78 79API version 14版本区分最大化状态示例: 80```ts 81// EntryAbility.ets 82import { BusinessError } from '@kit.BasicServicesKit'; 83 84export default class EntryAbility extends UIAbility { 85 // ... 86 onWindowStageCreate(windowStage: window.WindowStage) { 87 console.info('onWindowStageCreate'); 88 try { 89 let windowClass = windowStage.getMainWindowSync(); 90 windowClass?.on("windowStatusChange", (windowStatusType: window.WindowStatusType) => { 91 // 应用对于窗口全屏和最大化状态的处理逻辑不同,新增window.WindowStatusType.MAXIMIZE的判断分支 92 if (windowStatusType == window.WindowStatusType.FULL_SCREEN) { 93 // .... 94 } else if (windowStatusType == window.WindowStatusType.MAXIMIZE) { 95 // ... 96 } else { 97 // ... 98 } 99 }) 100 } catch (exception) { 101 console.error(`Failed to obtain the main window. Cause code: ${exception.code}, message: ${exception.message}`); 102 } 103 } 104} 105``` 106 107API version 14版本不区分最大化状态示例: 108```ts 109// EntryAbility.ets 110import { BusinessError } from '@kit.BasicServicesKit'; 111 112export default class EntryAbility extends UIAbility { 113 // ... 114 onWindowStageCreate(windowStage: window.WindowStage) { 115 console.info('onWindowStageCreate'); 116 try { 117 let windowClass = windowStage.getMainWindowSync(); 118 windowClass?.on("windowStatusChange", (windowStatusType: window.WindowStatusType) => { 119 // 应用对于窗口全屏和最大化状态的处理逻辑相同,直接在判断时新增针对window.WindowStatusType.MAXIMIZE的或条件 120 if (windowStatusType == window.WindowStatusType.FULL_SCREEN || 121 windowStatusType == window.WindowStatusType.MAXIMIZE) { 122 // .... 123 } else { 124 // ... 125 } 126 }) 127 } catch (exception) { 128 console.error(`Failed to obtain the main window. Cause code: ${exception.code}, message: ${exception.message}`); 129 } 130 } 131} 132``` 133 134## cl.window.2 在2in1设备上hasImmersiveWindow接口在窗口最大化状态返回值变更 135 136**访问级别** 137 138系统接口 139 140**变更原因** 141 142在2in1设备上调用hasImmersiveWindow接口在窗口处于最大化状态时返回true,与实际情况不符合。 143 144无法通过这个接口在2in1设备上区分是否有窗口处于最大化状态,还是全屏状态,与接口功能设计不符合。 145 146**变更影响** 147 148该变更为不兼容变更。 149 150变更前:2in1设备上调用hasImmersiveWindow接口时,如果窗口处于最大化状态时下,则返回true。 151 152变更后:2in1设备上调用hasImmersiveWindow接口时,如果窗口处于最大化状态时下,则返回false。 153 154**起始 API Level** 155 156hasImmersiveWindow接口从API version 11开始支持 157 158**变更发生版本** 159 160从OpenHarmony SDK 5.0.1.45开始。 161 162**变更的接口/组件** 163 164@ohos.display.d.ts 165 166系统能力:SystemCapability.Window.SessionManager 167 168接口:hasImmersiveWindow 169 170**适配指导** 171 172排查应用实现中是否存在调用hasImmersiveWindow判断当前屏幕是否包含全屏窗口的场景。若涉及,需要根据返回值变更进行调整适配。 173