1# @ohos.uiExtensionHost (系统接口) 2<!--Kit: ArkUI--> 3<!--Subsystem: Window--> 4<!--Owner: @chbchb12--> 5<!--Designer: @stupidb--> 6<!--Tester: @qinliwen0417--> 7<!--Adviser: @ge-yafang--> 8 9仅用于在有进程隔离诉求的UIExtensionComponent组件中为提供方应用提供宿主应用的窗口信息和组件本身的信息。 10 11> **说明** 12> 13> 后续此接口不再新增功能,相关功能在接口[uiExtension](js-apis-arkui-uiExtension.md)中提供。 14> 15> 从API Version 11开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 16> 17> 本模块接口为系统接口。 18 19## 导入模块 20 21``` 22import { uiExtensionHost } from '@kit.ArkUI'; 23``` 24 25## UIExtensionHostWindowProxy 26 27### getWindowAvoidArea 28 29getWindowAvoidArea(type: window.AvoidAreaType): window.AvoidArea 30 31获取宿主应用窗口内容规避的区域;如系统栏区域、刘海屏区域、手势区域、软键盘区域等与宿主窗口内容重叠时,需要宿主窗口内容避让的区域。 32 33**系统能力**:SystemCapability.ArkUI.ArkUI.Full 34 35**系统接口**:此接口为系统接口。 36 37| 参数名 | 类型 | 必填 | 说明 | 38| -------- | -------- | -------- | -------- | 39| type | [window.AvoidAreaType](arkts-apis-window-e.md#avoidareatype7) | 是 | 表示规避区类型。 | 40 41**返回值:** 42 43| 类型 | 说明 | 44| -------- | -------- | 45| [window.AvoidArea](arkts-apis-window-i.md#avoidarea7) | 宿主窗口内容规避区域。 | 46 47**错误码:** 48 49| 错误码ID | 错误信息 | 50| -------- | ---------------- | 51| 401 | Parameter error. | 52 53**示例:** 54 55```ts 56// ExtensionProvider.ts 57 58import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit'; 59import { window } from '@kit.ArkUI'; 60 61export default class EntryAbility extends UIExtensionAbility { 62 onSessionCreate(want: Want, session: UIExtensionContentSession) { 63 const extensionHostWindow = session.getUIExtensionHostWindowProxy(); 64 // 获取宿主应用窗口的避让信息 65 const avoidArea = extensionHostWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM); 66 console.log(`avoidArea: ${JSON.stringify(avoidArea)}`); 67 } 68} 69``` 70 71### on('avoidAreaChange') 72 73on(type: 'avoidAreaChange', callback: Callback<{ type: window.AvoidAreaType, area: window.AvoidArea }>): void 74 75注册系统规避区变化的监听。 76 77**系统能力**:SystemCapability.ArkUI.ArkUI.Full 78 79**系统接口**:此接口为系统接口。 80 81| 参数名 | 类型 | 必填 | 说明 | 82| -------- | ------ | ---- | ---------------------- | 83| type | string | 是 | 监听的事件类型,固定为'avoidAreaChange',即系统规避区变化事件。 | 84| callback | [Callback](../apis-basic-services-kit/js-apis-base.md#callback)<{ type: [window.AvoidAreaType](arkts-apis-window-e.md#avoidareatype7), area: [window.AvoidArea](arkts-apis-window-i.md#avoidarea7) }> | 是 | 回调函数:入参用于接收当前规避区的信息,其中,"type"表示窗口规避区类型,"area"表示窗口内容规避区域。 | 85 86**错误码:** 87 88| 错误码ID | 错误信息 | 89| -------- | ------------------------------------------------------------ | 90| 401 | Parameter error. Possible causes: <br/> 1. Mandatory parameters are left unspecified.<br/> 2. Incorrect parameters types.<br/> 3. Parameter verification failed. | 91 92**示例:** 93 94```ts 95// ExtensionProvider.ts 96import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit'; 97 98export default class EntryAbility extends UIExtensionAbility { 99 onSessionCreate(want: Want, session: UIExtensionContentSession) { 100 const extensionHostWindow = session.getUIExtensionHostWindowProxy(); 101 // 注册避让区变化的监听 102 extensionHostWindow.on('avoidAreaChange', (info) => { 103 console.info(`The avoid area of the host window is: ${JSON.stringify(info.area)}.`); 104 }); 105 } 106} 107``` 108 109### off('avoidAreaChange') 110 111off(type: 'avoidAreaChange', callback?: Callback<{ type: window.AvoidAreaType, area: window.AvoidArea }>): void 112 113注销系统规避区变化的监听。 114 115**系统能力**:SystemCapability.ArkUI.ArkUI.Full 116 117**系统接口**:此接口为系统接口。 118 119| 参数名 | 类型 | 必填 | 说明 | 120| -------- | ------ | ---- | ---------------------- | 121| type | string | 是 | 注销的事件类型,固定为'avoidAreaChange',即系统规避区变化事件。 | 122| callback | [Callback](../apis-basic-services-kit/js-apis-base.md#callback)<{ type: [window.AvoidAreaType](arkts-apis-window-e.md#avoidareatype7), area: [window.AvoidArea](arkts-apis-window-i.md#avoidarea7) }> | 否 | 回调函数:如果传入该参数,则关闭该监听。如果未传入参数,则关闭所有系统规避区变化的监听。 | 123 124**错误码:** 125 126| 错误码ID | 错误信息 | 127| -------- | ------------------------------------------------------------ | 128| 401 | Parameter error. Possible causes: <br/> 1. Mandatory parameters are left unspecified.<br/> 2. Incorrect parameters types.<br/> 3. Parameter verification failed. | 129 130**示例:** 131 132```ts 133// ExtensionProvider.ts 134import { UIExtensionAbility, UIExtensionContentSession} from '@kit.AbilityKit'; 135 136export default class EntryAbility extends UIExtensionAbility { 137 onSessionDestroy(session: UIExtensionContentSession) { 138 const extensionHostWindow = session.getUIExtensionHostWindowProxy(); 139 // 注销所有避让区变化的监听 140 extensionHostWindow.off('avoidAreaChange'); 141 } 142} 143``` 144 145### on('windowSizeChange') 146 147on(type: 'windowSizeChange', callback: Callback<window.Size>): void 148 149注册宿主应用窗口尺寸变化的监听。 150 151**系统能力**:SystemCapability.ArkUI.ArkUI.Full 152 153**系统接口**:此接口为系统接口。 154 155| 参数名 | 类型 | 必填 | 说明 | 156| -------- | --------------------- | ---- | ---------------------- | 157| type | string | 是 | 监听的事件类型,固定为'windowSizeChange',即窗口尺寸变化事件。 | 158| callback | [Callback](../apis-basic-services-kit/js-apis-base.md#callback)<[window.Size](arkts-apis-window-i.md#size7)> | 是 | 回调函数:入参用于接收当前窗口的尺寸。 | 159 160**错误码:** 161 162| 错误码ID | 错误信息 | 163| -------- | ------------------------------------------------------------ | 164| 401 | Parameter error. Possible causes: <br/> 1. Mandatory parameters are left unspecified.<br/> 2. Incorrect parameters types.<br/> 3. Parameter verification failed. | 165 166**示例:** 167 168```ts 169// ExtensionProvider.ts 170import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit'; 171 172export default class EntryAbility extends UIExtensionAbility { 173 onSessionCreate(want: Want, session: UIExtensionContentSession) { 174 const extensionHostWindow = session.getUIExtensionHostWindowProxy(); 175 // 注册宿主应用窗口大小变化的监听 176 extensionHostWindow.on('windowSizeChange', (size) => { 177 console.info(`The avoid area of the host window is: ${JSON.stringify(size)}.`); 178 }); 179 } 180} 181``` 182 183### off('windowSizeChange') 184 185off(type: 'windowSizeChange', callback?: Callback<window.Size>): void 186 187注销宿主应用窗口尺寸变化的监听。 188 189**系统能力**:SystemCapability.ArkUI.ArkUI.Full 190 191**系统接口**:此接口为系统接口。 192 193| 参数名 | 类型 | 必填 | 说明 | 194| -------- | --------------------- | ---- | ---------------------- | 195| type | string | 是 | 注销的事件类型,固定值:'windowSizeChange',即窗口尺寸变化事件。 | 196| callback | [Callback](../apis-basic-services-kit/js-apis-base.md#callback)<[window.Size](arkts-apis-window-i.md#size7)> | 否 | 回调函数:如果传入该参数,则关闭该监听。如果未传入参数,则关闭所有系统规避区变化的监听。 | 197 198**错误码:** 199 200| 错误码ID | 错误信息 | 201| -------- | ------------------------------------------------------------ | 202| 401 | Parameter error. Possible causes: <br/> 1. Mandatory parameters are left unspecified.<br/> 2. Incorrect parameters types.<br/> 3. Parameter verification failed. | 203 204**示例:** 205 206```ts 207// ExtensionProvider.ts 208import { UIExtensionAbility, UIExtensionContentSession } from '@kit.AbilityKit'; 209 210export default class EntryAbility extends UIExtensionAbility { 211 onSessionDestroy(session: UIExtensionContentSession) { 212 const extensionHostWindow = session.getUIExtensionHostWindowProxy(); 213 // 注销宿主应用窗口大小变化的监听 214 extensionHostWindow.off('windowSizeChange'); 215 } 216} 217``` 218 219### properties 220 221properties: UIExtensionHostWindowProxyProperties 222 223宿主应用窗口和UIExtensionComponent组件的信息。 224 225**系统能力**:SystemCapability.ArkUI.ArkUI.Full 226 227**系统接口**:此接口为系统接口。 228 229| 参数名 | 类型 | 说明 | 230| ---------- | ------------------------------------ | -------------------------------- | 231| properties | [UIExtensionHostWindowProxyProperties](#uiextensionhostwindowproxyproperties) | UIExtensionComponent组件以及宿主窗口的信息。 | 232 233**示例:** 234 235```ts 236// ExtensionProvider.ts 237import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit'; 238 239export default class EntryAbility extends UIExtensionAbility { 240 onSessionCreate(want: Want, session: UIExtensionContentSession) { 241 const extensionHostWindow = session.getUIExtensionHostWindowProxy(); 242 // 获取UIExtensionComponent位置和大小信息 243 const rect = extensionHostWindow.properties.uiExtensionHostWindowProxyRect; 244 console.log(`Rect Info: ${JSON.stringify(rect)}`); 245 } 246} 247``` 248 249### hideNonSecureWindows 250 251hideNonSecureWindows(shouldHide: boolean): Promise<void> 252 253设置是否隐藏不安全窗口,使用Promise异步回调。 254> **说明:** 255> 256> - 不安全窗口是指可能遮挡[EmbeddedComponent](arkui-ts/ts-container-embedded-component.md)(或[UIExtensionComponent](arkui-ts/ts-container-ui-extension-component-sys.md))组件的窗口,如全局悬浮窗、宿主子窗口和宿主创建的Dialog窗口(不包括系统应用创建的上述类型窗口)。 257> - 当EmbeddedComponent(或UIExtensionComponent)组件被用来显示敏感操作提示内容时,可以选择隐藏不安全窗口,保护敏感操作提示内容不会被遮挡。当EmbeddedComponent(或UIExtensionComponent)组件不显示或销毁时,不安全窗口会重新显示。 258> - 针对PC/2in1设备,当调用hideNonSecureWindows(true)时,不安全窗口中的全局悬浮窗不会被隐藏。 259 260**需要权限**:ohos.permission.ALLOW_SHOW_NON_SECURE_WINDOWS 261 262**系统能力**:SystemCapability.ArkUI.ArkUI.Full 263 264**系统接口**:此接口为系统接口。 265 266**参数:** 267 268| 参数名 | 类型 | 必填 | 说明 | 269| ----------- | ------------------------- | ---- | ---------- | 270| shouldHide | boolean | 是 | 指示是否隐藏不安全窗口,true表示隐藏,false表示不隐藏。 | 271 272**返回值:** 273 274| 类型 | 说明 | 275| ------------------- | ------------------------- | 276| Promise<void> | 无返回结果的Promise对象。 | 277 278**错误码:** 279 280| 错误码ID | 错误信息 | 281| -------- | ------------------------------------------------------------ | 282| 202 | Permission verification failed. A non-system application calls a system API. | 283| 401 | Parameter error. Possible causes: <br> 1. Mandatory parameters are left unspecified. <br> 2. Incorrect parameters types. <br> 3. Parameter verification failed. | 284| 1300002 | Abnormal state. Possible causes: <br> 1. Permission denied. Interface caller does not have permission "ohos.permission.ALLOW_SHOW_NON_SECURE_WINDOWS". <br> 2. The UIExtension window proxy is abnormal. | 285| 1300003 | This window manager service works abnormally. | 286 287**示例:** 288 289```ts 290// ExtensionProvider.ts 291 292import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit'; 293import { BusinessError } from '@kit.BasicServicesKit'; 294 295export default class EntryAbility extends UIExtensionAbility { 296 onSessionCreate(want: Want, session: UIExtensionContentSession) { 297 const extensionHostWindow = session.getUIExtensionHostWindowProxy(); 298 // 隐藏非安全窗口 299 extensionHostWindow.hideNonSecureWindows(true).then(()=> { 300 console.info(`Succeeded in hiding the non-secure windows.`); 301 }).catch((err: BusinessError)=> { 302 console.error(`Failed to hide the non-secure windows. Cause:${JSON.stringify(err)}`); 303 }) 304 } 305 onSessionDestroy(session: UIExtensionContentSession) { 306 const extensionHostWindow = session.getUIExtensionHostWindowProxy(); 307 // 取消隐藏非安全窗口 308 extensionHostWindow.hideNonSecureWindows(false).then(()=> { 309 console.info(`Succeeded in showing the non-secure windows.`); 310 }).catch((err: BusinessError)=> { 311 console.error(`Failed to show the non-secure windows. Cause:${JSON.stringify(err)}`); 312 }) 313 } 314} 315``` 316 317### createSubWindowWithOptions<sup>12+</sup> 318 319createSubWindowWithOptions(name: string, subWindowOptions: window.SubWindowOptions): Promise<window.Window> 320 321创建该UIExtensionHostWindowProxy实例下的子窗口,使用Promise异步回调。 322 323**系统能力:** SystemCapability.ArkUI.ArkUI.Full 324 325**系统接口:** 此接口为系统接口。 326 327**模型约束:** StageModelOnly 328 329**参数:** 330 331| 参数名 | 类型 | 必填 | 说明 | 332| ------ | ------ | ---- | -------------- | 333| name | string | 是 | 子窗口的名字。 | 334| subWindowOptions | [window.SubWindowOptions](arkts-apis-window-i.md#subwindowoptions11) | 是 | 子窗口参数。 | 335 336**返回值:** 337 338| 类型 | 说明 | 339| -------------------------------- | ------------------------------------------------ | 340| Promise<[window.Window](arkts-apis-window-Window.md)> | Promise对象。返回当前UIExtensionHostWindowProxy下创建的子窗口对象。 | 341 342**错误码:** 343 344以下错误码的详细介绍请参见[窗口错误码](errorcode-window.md)。 345 346| 错误码ID | 错误信息 | 347| ------- | ------------------------------ | 348| 401 | Parameter error. Possible causes: <br/> 1. Mandatory parameters are left unspecified.<br/> 2. Incorrect parameters types.<br/> 3. Parameter verification failed. | 349| 801 | Capability not supported. Failed to call the API due to limited device capabilities. | 350| 1300002 | This window state is abnormal. | 351 352**示例:** 353 354```ts 355// ExtensionProvider.ts 356import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit'; 357import { BusinessError } from '@kit.BasicServicesKit'; 358import { window } from '@kit.ArkUI'; 359 360export default class EntryAbility extends UIExtensionAbility { 361 onSessionCreate(want: Want, session: UIExtensionContentSession) { 362 const extensionHostWindow = session.getUIExtensionHostWindowProxy(); 363 const subWindowOpts: window.SubWindowOptions = { 364 title: 'This is a subwindow', 365 decorEnabled: true 366 }; 367 // 创建子窗口 368 extensionHostWindow.createSubWindowWithOptions('subWindowForHost', subWindowOpts) 369 .then((subWindow: window.Window) => { 370 subWindow.setUIContent('pages/Index', (err, data) =>{ 371 if (err && err.code != 0) { 372 return; 373 } 374 subWindow?.resize(300, 300, (err, data)=>{ 375 if (err && err.code != 0) { 376 return; 377 } 378 subWindow?.moveWindowTo(100, 100, (err, data)=>{ 379 if (err && err.code != 0) { 380 return; 381 } 382 subWindow?.showWindow((err, data) => { 383 if (err && err.code == 0) { 384 console.info(`The subwindow has been shown!`); 385 } else { 386 console.error(`Failed to show the subwindow!`); 387 } 388 }); 389 }); 390 }); 391 }); 392 }).catch((error: BusinessError) => { 393 console.error(`Create subwindow failed: ${JSON.stringify(error)}`); 394 }) 395 } 396} 397``` 398 399### setWaterMarkFlag<sup>12+</sup> 400 401setWaterMarkFlag(enable: boolean): Promise<void> 402 403为当前窗口添加或删除安全水印标志,使用Promise异步回调。 404> **说明:** 405> 406> 添加安全水印标志后,窗口在前台时会将当前全屏幕覆盖水印。全屏、悬浮窗、分屏等场景下只要有添加了安全水印标志的窗口在前台,就会显示全屏水印。 407 408**系统能力**:SystemCapability.ArkUI.ArkUI.Full 409 410**系统接口**:此接口为系统接口。 411 412**参数:** 413 414| 参数名 | 类型 | 必填 | 说明 | 415| ------ | ------- | --- | ------------------------------------------------ | 416| enable | boolean | 是 | 是否对窗口添加标志位。true表示添加,false表示删除。 | 417 418**返回值:** 419 420| 类型 | 说明 | 421| ------------------- | ------------------------- | 422| Promise<void> | 无返回结果的Promise对象。 | 423 424**错误码:** 425 426| 错误码ID | 错误信息 | 427| ------- | ---------------------------------------------- | 428| 1300002 | The UIExtension window proxy is abnormal. | 429| 1300003 | This window manager service works abnormally. | 430| 1300008 | The display device is abnormal. | 431 432**示例:** 433 434```ts 435// ExtensionProvider.ts 436import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit'; 437import { BusinessError } from '@kit.BasicServicesKit'; 438 439export default class EntryAbility extends UIExtensionAbility { 440 onSessionCreate(want: Want, session: UIExtensionContentSession) { 441 const extensionHostWindow = session.getUIExtensionHostWindowProxy(); 442 // 添加安全水印标志 443 extensionHostWindow.setWaterMarkFlag(true).then(() => { 444 console.info(`Succeeded in setting water mark flag of window.`); 445 }).catch((err: BusinessError) => { 446 console.error(`Failed to setting water mark flag of window. Cause:${JSON.stringify(err)}`); 447 }) 448 } 449 onSessionDestroy(session: UIExtensionContentSession) { 450 const extensionHostWindow = session.getUIExtensionHostWindowProxy(); 451 // 删除安全水印标志 452 extensionHostWindow.setWaterMarkFlag(false).then(() => { 453 console.info(`Succeeded in deleting water mark flag of window.`); 454 }).catch((err: BusinessError) => { 455 console.error(`Failed to deleting water mark flag of window. Cause:${JSON.stringify(err)}`); 456 }) 457 } 458} 459``` 460### hidePrivacyContentForHost<sup>13+</sup> 461 462hidePrivacyContentForHost(shouldHide: boolean): Promise<void> 463 464设置UIExtension组件在非系统截图时的隐私内容保护开关,使用Promise异步回调。 465> **说明:** 466> 467> 开启截图隐私内容保护后,使用窗口截图[window.snapshot](arkts-apis-window-Window.md#snapshot9)或者组件截图[UIContext.getComponentSnapshot](arkts-apis-uicontext-uicontext.md#getcomponentsnapshot12) 468将无法截取到当前组件的内容(不包括该组件下创建的子窗)。 469 470**系统能力**:SystemCapability.ArkUI.ArkUI.Full 471 472**系统接口**:此接口为系统接口。 473 474**参数:** 475 476| 参数名 | 类型 | 必填 | 说明 | 477| ------ | ------- | --- | ------------------------------------------------ | 478| shouldHide | boolean | 是 | 是否开启截图隐私保护。true表示开启,false表示不开启。 | 479 480**返回值:** 481 482| 类型 | 说明 | 483| ------------------- | ------------------------- | 484| Promise<void> | 无返回结果的Promise对象。 | 485 486**错误码:** 487 488以下错误码的详细介绍请参见[窗口错误码](errorcode-window.md)。 489 490| 错误码ID | 错误信息 | 491| -------- | ------------------------------------------------------------ | 492| 202 | Permission verification failed. A non-system application calls a system API. | 493| 401 | Parameter error. Possible causes: <br> 1. Mandatory parameters are left unspecified. <br> 2. Incorrect parameters types. <br> 3. Parameter verification failed. | 494| 1300002 | Abnormal state. Possible causes: <br> 1. The UIExtension window proxy is abnormal. <br> 2. Not the UIExtensionAbility process calling. | 495 496**示例:** 497 498```ts 499// ExtensionProvider.ts 500import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit'; 501import { BusinessError } from '@kit.BasicServicesKit'; 502 503export default class EntryAbility extends UIExtensionAbility { 504 onSessionCreate(want: Want, session: UIExtensionContentSession) { 505 const extensionHostWindow = session.getUIExtensionHostWindowProxy(); 506 // 开启截图隐私内容保护 507 extensionHostWindow.hidePrivacyContentForHost(true).then(() => { 508 console.info(`Successfully enabled privacy protection for non-system screenshots.`); 509 }).catch((err: BusinessError) => { 510 console.error(`Failed enabled privacy protection for non-system screenshots. Cause:${JSON.stringify(err)}`); 511 }) 512 } 513} 514``` 515 516## UIExtensionHostWindowProxyProperties 517 518用于表示宿主应用窗口和UIExtensionComponent组件的信息。 519 520**系统能力**:SystemCapability.ArkUI.ArkUI.Full 521 522**系统接口**:此接口为系统接口。 523 524| 名称 | 类型 | 必填 | 说明 | 525| ------------------------------ | ----------- | -------------------------------- | -------------------------------- | 526| uiExtensionHostWindowProxyRect | [window.Rect](arkts-apis-window-i.md#rect7) | 是 | UIExtensionComponent的位置和宽高。 | 527 528## 完整示例 529 530本示例展示文档中所有API在UIExtensionAbility中的基础使用方式,示例应用需采用系统签名,且`bundleName`为"com.example.uiextensiondemo", 被拉起的`UIExtensionAbility`为"ExampleUIExtensionAbility"。 531 532- 示例应用中的EntryAbility(UIAbility)加载首页文件:`pages/Index.ets`,其中内容如下: 533 534 ```ts 535 // pages/Index.ets -- UIAbility启动时加载此页面 536 import { Want } from '@kit.AbilityKit'; 537 538 @Entry 539 @Component 540 struct Index { 541 @State message: string = 'Message: '; 542 private want: Want = { 543 bundleName: "com.example.uiextensiondemo", 544 abilityName: "ExampleUIExtensionAbility", 545 parameters: { 546 "ability.want.params.uiExtensionType": "sys/commonUI" 547 } 548 } 549 550 build() { 551 Row() { 552 Column() { 553 Text(this.message).fontSize(30) 554 UIExtensionComponent(this.want) 555 .width('100%') 556 .height('90%') 557 } 558 .width('100%') 559 } 560 .height('100%') 561 } 562 } 563 ``` 564 565- UIExtensionComponent拉起的UIExtensionAbility在`ets/extensionAbility/ExampleUIExtensionAbility`文件中实现,内容如下: 566 567 ```ts 568 import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit'; 569 570 const TAG: string = '[ExampleUIExtensionAbility]'; 571 export default class ExampleUIExtensionAbility extends UIExtensionAbility { 572 onCreate() { 573 console.log(TAG, `onCreate`); 574 } 575 576 onForeground() { 577 console.log(TAG, `onForeground`); 578 } 579 580 onBackground() { 581 console.log(TAG, `onBackground`); 582 } 583 584 onDestroy() { 585 console.log(TAG, `onDestroy`); 586 } 587 588 onSessionCreate(want: Want, session: UIExtensionContentSession) { 589 console.log(TAG, `onSessionCreate, want: ${JSON.stringify(want)}`); 590 let param: Record<string, UIExtensionContentSession> = { 591 'session': session 592 }; 593 let storage: LocalStorage = new LocalStorage(param); 594 session.loadContent('pages/extension', storage); 595 } 596 } 597 ``` 598 599- UIExtensionAbility的入口页面文件`pages/extension.ets`内容如下: 600 601 ```ts 602 import { UIExtensionContentSession } from '@kit.AbilityKit'; 603 import { BusinessError } from '@kit.BasicServicesKit'; 604 import { uiExtensionHost, window } from '@kit.ArkUI'; 605 606 @Entry() 607 @Component 608 struct Extension { 609 @State message: string = 'UIExtensionAbility Index'; 610 private storage: LocalStorage | undefined = this.getUIContext()?.getSharedLocalStorage(); 611 private session: UIExtensionContentSession | undefined = this.storage?.get<UIExtensionContentSession>('session'); 612 private extensionHostWindow: uiExtensionHost.UIExtensionHostWindowProxy | undefined = this.session?.getUIExtensionHostWindowProxy(); 613 private subWindow: window.Window | undefined = undefined; 614 615 aboutToAppear(): void { 616 this.extensionHostWindow?.on('windowSizeChange', (size) => { 617 console.info(`size = ${JSON.stringify(size)}`); 618 }); 619 this.extensionHostWindow?.on('avoidAreaChange', (info) => { 620 console.info(`type = ${JSON.stringify(info.type)}, area = ${JSON.stringify(info.area)}`); 621 }); 622 let promise = this.extensionHostWindow?.hideNonSecureWindows(true); 623 promise?.then(()=> { 624 console.log(`Succeeded in hiding the non-secure windows.`); 625 }).catch((err: BusinessError)=> { 626 console.log(`Failed to hide the non-secure windows. Cause:${JSON.stringify(err)}`); 627 }) 628 this.extensionHostWindow?.hidePrivacyContentForHost(true)?.then(() => { 629 console.log(`Successfully enabled privacy protection for non-system screenshots.`); 630 }).catch((err: BusinessError) => { 631 console.log(`Failed enabled privacy protection for non-system screenshots. Cause:${JSON.stringify(err)}`); 632 }) 633 } 634 635 aboutToDisappear(): void { 636 this.extensionHostWindow?.off('windowSizeChange'); 637 this.extensionHostWindow?.off('avoidAreaChange'); 638 let promise = this.extensionHostWindow?.hideNonSecureWindows(false); 639 promise?.then(()=> { 640 console.log(`Succeeded in showing the non-secure windows.`); 641 }).catch((err: BusinessError)=> { 642 console.log(`Failed to show the non-secure windows. Cause:${JSON.stringify(err)}`); 643 }) 644 } 645 646 build() { 647 Column() { 648 Text(this.message) 649 .fontSize(20) 650 .fontWeight(FontWeight.Bold) 651 Button("获取组件大小").width('90%').margin({top: 5, bottom: 5}).fontSize(16).onClick(() => { 652 let rect = this.extensionHostWindow?.properties.uiExtensionHostWindowProxyRect; 653 console.info(`UIExtensionComponent的宽高和位置信息: ${JSON.stringify(rect)}`); 654 }) 655 Button("获取系统规避区信息").width('90%').margin({top: 5, bottom: 5}).fontSize(16).onClick(() => { 656 let avoidArea: window.AvoidArea | undefined = this.extensionHostWindow?.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM); 657 console.info(`系统规避区: ${JSON.stringify(avoidArea)}`); 658 }) 659 Button("创建子窗口").width('90%').margin({top: 5, bottom: 5}).fontSize(16).onClick(() => { 660 let subWindowOpts: window.SubWindowOptions = { 661 'title': 'This is a subwindow', 662 decorEnabled: true 663 }; 664 this.extensionHostWindow?.createSubWindowWithOptions('subWindowForHost', subWindowOpts) 665 .then((subWindow: window.Window) => { 666 this.subWindow = subWindow; 667 this.subWindow.loadContent('pages/Index', this.storage, (err, data) =>{ 668 if (err && err.code != 0) { 669 return; 670 } 671 this.subWindow?.resize(300, 300, (err, data)=>{ 672 if (err && err.code != 0) { 673 return; 674 } 675 this.subWindow?.moveWindowTo(100, 100, (err, data)=>{ 676 if (err && err.code != 0) { 677 return; 678 } 679 this.subWindow?.showWindow((err, data) => { 680 if (err && err.code == 0) { 681 console.info(`The subwindow has been shown!`); 682 } else { 683 console.error(`Failed to show the subwindow!`); 684 } 685 }); 686 }); 687 }); 688 }); 689 }).catch((error: BusinessError) => { 690 console.error(`Create subwindow failed: ${JSON.stringify(error)}`); 691 }) 692 }) 693 }.width('100%').height('100%') 694 } 695 } 696 ``` 697 698- 最后,示例应用的`module.json5`中的"extensionAbilities"中需要增加一项,具体内容如下: 699 ```json 700 { 701 "name": "ExampleUIExtensionAbility", 702 "srcEntry": "./ets/extensionAbility/ExampleUIExtensionAbility.ets", 703 "type": "sys/commonUI", 704 } 705 ``` 706