• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.uiExtensionHost (系统接口)
2
3仅用于在有进程隔离诉求的UIExtensionComponent组件中为提供方应用提供宿主应用的窗口信息和组件本身的信息。
4
5> **说明**
6>
7> 从API Version 11开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8>
9> 本模块接口为系统接口。
10
11## 导入模块
12
13```
14import uiExtensionHost from '@ohos.uiExtensionHost'
15```
16
17## UIExtensionHostWindowProxyProperties
18
19uiExtensionHostWindowProxyRect: window.Rect
20
21获取UIExtensionComponent的位置和宽高信息。
22
23**系统能力**:SystemCapability.ArkUI.ArkUI.Full
24
25**系统接口**:此接口为系统接口
26
27| 属性名                         | 类型        | 说明                             |
28| ------------------------------ | ----------- | -------------------------------- |
29| uiExtensionHostWindowProxyRect | [window.Rect](js-apis-window.md) | UIExtensionComponent的位置和宽高。 |
30
31**示例**
32
33```ts
34@Entry(storage)
35@Component
36struct Hello {
37  private extensionWindow: uiExtensionHost.UIExtensionHostWindowProxy = storage.get<uiExtensionHost.UIExtensionHostWindowProxy>('extensionWindow')
38  private extensionWindowRect = this.extensionWindow.properties.uiExtensionHostWindowProxyRect
39
40  build() {
41    Row() {
42      Column() {
43        Text("Hello world")
44      }
45      .width('100%')
46    }
47    .height('100%')
48  }
49}
50```
51
52## UIExtensionHostWindowProxy
53
54### getWindowAvoidArea
55
56getWindowAvoidArea(type: window.AvoidAreaType): window.AvoidArea
57
58获取窗口具体避让类型的避让区信息。
59
60**系统能力**:SystemCapability.ArkUI.ArkUI.Full
61
62**系统API**:此接口为系统接口,三方应用不支持调用。
63
64| 参数名 | 类型 | 必填 | 说明 |
65| -------- | -------- | -------- | -------- |
66| type |[window.AvoidAreaType](js-apis-window.md) | 是 | 获取的避让区类型 |
67
68**返回值:**
69
70| 类型 | 说明 |
71| -------- | -------- |
72|[window.AvoidArea](js-apis-window.md) | 避让区信息 |
73
74**示例**
75
76```ts
77@Entry(storage)
78@Component
79struct Hello {
80  private extensionWindow: uiExtensionHost.UIExtensionHostWindowProxy = storage.get<uiExtensionHost.UIExtensionHostWindowProxy>('extensionWindow')
81
82  build() {
83    Row() {
84      Column() {
85        Button("TYPE_SYSTEM").onClick(() => {
86          if (this.extensionWindow != undefined) {
87            let avoidArea: window.AvoidArea = this.extensionWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM)
88            console.log(`${JSON.stringify(avoidArea)}`)
89          }
90        })
91      }
92      .width('100%')
93    }
94    .height('100%')
95  }
96}
97```
98
99### on('avoidAreaChange')
100
101on(type: 'avoidAreaChange', callback: Callback<{ type: window.AvoidAreaType, area: window.AvoidArea }>): void
102
103注册避让区域变更回调方法
104
105**系统能力**:SystemCapability.ArkUI.ArkUI.Full
106
107**系统API**:此接口为系统接口,三方应用不支持调用。
108
109| 参数名   | 类型                                                         | 必填 | 说明                   |
110| -------- | ------------------------------------------------------------ | ---- | ---------------------- |
111| type     | string                                                       | 是   | 注册的回调方法类型说明。 |
112| callback | Callback<{ type: window.AvoidAreaType, area: window.AvoidArea }> | 是   | 注册的回调方法。        |
113
114**示例**
115
116```ts
117@Entry(storage)
118@Component
119struct Hello {
120  private extensionWindow: uiExtensionHost.UIExtensionHostWindowProxy = storage.get<uiExtensionHost.UIExtensionHostWindowProxy>('extensionWindow')
121
122  aboutToAppear() {
123    this.extensionWindow.on('avoidAreaChange', (avoid) => {
124      console.info(`${JSON.stringify(avoid.type)}`)
125      console.info(`${JSON.stringify(avoid.area)}`)
126    })
127  }
128
129  build() {
130    Row() {
131      Column() {
132        Text("Hello world")
133      }
134      .width('100%')
135    }
136    .height('100%')
137  }
138}
139```
140
141### off('avoidAreaChange')
142
143off(type: 'avoidAreaChange', callback?: Callback<{ type: window.AvoidAreaType, area: window.AvoidArea }>): void
144
145注销避让区域变更回调方法
146
147**系统能力**:SystemCapability.ArkUI.ArkUI.Full
148
149**系统API**:此接口为系统接口,三方应用不支持调用。
150
151| 参数名   | 类型                                                         | 必填 | 说明                   |
152| -------- | ------------------------------------------------------------ | ---- | ---------------------- |
153| type     | string                                                       | 是   | 注销的回调方法类型说明。 |
154| callback | Callback<{ type: window.AvoidAreaType, area: window.AvoidArea }> | 是   | 注销的回调方法。   |
155
156**示例**
157
158```ts
159@Entry(storage)
160@Component
161struct Hello {
162  private extensionWindow: uiExtensionHost.UIExtensionHostWindowProxy = storage.get<uiExtensionHost.UIExtensionHostWindowProxy>('extensionWindow')
163  private avoidAreaChangeCallback: Callback<{ type: window.AvoidAreaType, area: window.AvoidArea }> = (avoid) => {
164    console.info(`${JSON.stringify(avoid.area)}`)
165    console.info(`${JSON.stringify(avoid.type)}`)
166  }
167
168  aboutToAppear() {
169    this.extensionWindow.on('avoidAreaChange', this.avoidAreaChangeCallback)
170  }
171
172  build() {
173    Row() {
174      Column() {
175        Button("注销回调").onClick(() => {
176          this.extensionWindow.off('avoidAreaChange', this.avoidAreaChangeCallback)
177        })
178      }
179      .width('100%')
180    }
181    .height('100%')
182  }
183}
184```
185
186### on('windowSizeChange')
187
188on(type: 'windowSizeChange', callback: Callback<window.Size>): void
189
190注册窗口信息变更回调方法
191
192**系统能力**:SystemCapability.ArkUI.ArkUI.Full
193
194**系统API**:此接口为系统接口,三方应用不支持调用。
195
196| 参数名   | 类型                  | 必填 | 说明                   |
197| -------- | --------------------- | ---- | ---------------------- |
198| type     | string                | 是   | 注册的回调方法类型说明。 |
199| callback | Callback<window.Size> | 是   | 注册的回调方法。         |
200
201**示例**
202
203```ts
204@Entry(storage)
205@Component
206struct Hello {
207  private extensionWindow: uiExtensionHost.UIExtensionHostWindowProxy = storage.get<uiExtensionHost.UIExtensionHostWindowProxy>('extensionWindow')
208
209  aboutToAppear() {
210    this.extensionWindow.on('windowSizeChange', (size) => {
211      console.info(`${JSON.stringify(size)}`)
212    })
213  }
214
215  build() {
216    Row() {
217      Column() {
218        Text("Hello world")
219      }
220      .width('100%')
221    }
222    .height('100%')
223  }
224}
225```
226
227### off('windowSizeChange')
228
229off(type: 'windowSizeChange', callback?: Callback<window.Size>): void
230
231注销窗口信息变更回调方法
232
233**系统能力**:SystemCapability.ArkUI.ArkUI.Full
234
235**系统API**:此接口为系统接口,三方应用不支持调用。
236
237| 参数名   | 类型                  | 必填 | 说明                   |
238| -------- | --------------------- | ---- | ---------------------- |
239| type     | string                | 是   | 注销的回调方法类型说明。 |
240| callback | Callback<window.Size> | 是   | 注销的回调方法。         |
241
242**示例**
243
244```ts
245@Entry(storage)
246@Component
247struct Hello {
248  private extensionWindow: uiExtensionHost.UIExtensionHostWindowProxy = storage.get<uiExtensionHost.UIExtensionHostWindowProxy>('extensionWindow')
249  private windowSizeChangeCallback: Callback<window.Size> = (size) => {
250    console.info(`${JSON.stringify(size)}`)
251  }
252
253  aboutToAppear() {
254    this.extensionWindow.on('windowSizeChange', this.windowSizeChangeCallback)
255  }
256
257
258  build() {
259    Row() {
260      Column() {
261        Button("注销回调").onClick(() => {
262          this.extensionWindow.off('windowSizeChange', this.windowSizeChangeCallback)
263        })
264      }
265      .width('100%')
266    }
267    .height('100%')
268  }
269}
270```
271
272### properties
273
274properties: UIExtensionHostWindowProxyProperties
275
276UIExtensionComponent组件以及宿主窗口的信息
277
278**系统能力**:SystemCapability.ArkUI.ArkUI.Full
279
280**系统API**:此接口为系统接口,三方应用不支持调用。
281
282| 参数名     | 类型                                 | 说明                             |
283| ---------- | ------------------------------------ | -------------------------------- |
284| properties | UIExtensionHostWindowProxyProperties | UIExtensionComponent的位置和宽高。 |
285
286**示例**
287
288```ts
289@Entry(storage)
290@Component
291struct Hello {
292  private extensionWindow: uiExtensionHost.UIExtensionHostWindowProxy = storage.get<uiExtensionHost.UIExtensionHostWindowProxy>('extensionWindow')
293  private properties = this.extensionWindow.properties
294
295  build() {
296    Row() {
297      Column() {
298        Text(`UIExtensionWindowRect: ${JSON.stringify(this.properties.uiExtensionHostWindowProxyRect)}`)
299      }
300      .width('100%')
301    }
302    .height('100%')
303  }
304}
305```
306
307### hideNonSecureWindows
308
309hideNonSecureWindows(shouldHide: boolean): Promise\<void>
310
311设置是否隐藏不安全窗口。
312不安全窗口是指可能遮挡UIExtensionComponent的窗口类型,如非系统全局悬浮窗、宿主子窗口。当UIExtensionComponent组件被用来显示敏感操作提示内容时,可以选择隐藏不安全窗口,保护敏感操作提示内容不会被遮挡。当UIExtensionComponent不显示或销毁时需要让不安全窗口重新显示。
313
314**系统能力**:SystemCapability.ArkUI.ArkUI.Full
315
316**系统API**:此接口为系统接口,三方应用不支持调用。
317
318**参数:**
319
320| 参数名      | 类型                      | 必填 | 说明       |
321| ----------- | ------------------------- | ---- | ---------- |
322| shouldHide  | boolean                   | 是   | 指示是否隐藏不安全窗口,true表示隐藏,false表示不隐藏。 |
323
324**返回值:**
325
326| 类型                | 说明                      |
327| ------------------- | ------------------------- |
328| Promise&lt;void&gt; | 无返回结果的Promise对象。 |
329
330**示例**
331
332```ts
333import UIExtensionAbility from '@ohos.app.ability.UIExtensionAbility'
334import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession'
335import Want from '@ohos.app.ability.Want';
336const TAG: string = '[UIExtAbility]'
337export default class UIExtAbility extends UIExtensionAbility {
338
339  onCreate() {
340    console.log(TAG, `UIExtAbility onCreate`)
341  }
342
343  onForeground() {
344    console.log(TAG, `UIExtAbility onForeground`)
345  }
346
347  onBackground() {
348    console.log(TAG, `UIExtAbility onBackground`)
349  }
350
351  onDestroy() {
352    console.log(TAG, `UIExtAbility onDestroy`)
353  }
354
355  onSessionCreate(want: Want, session: UIExtensionContentSession) {
356    console.log(TAG, `UIExtAbility onSessionCreate`)
357    session.loadContent('pages/extension');
358
359    let extensionHostWindow = session.getUIExtensionHostWindowProxy();
360    let promise = extensionHostWindow.hideNonSecureWindows(true);
361    promise.then(()=> {
362      console.log(TAG, `Succeeded in hiding the non-secure windows.`);
363    }).catch((err: BusinessError)=> {
364      console.log(TAG, `Failed to hide the non-secure windows. Cause:${JSON.stringify(err)}`);
365    })
366  }
367
368  onSessionDestroy(session: UIExtensionContentSession) {
369    console.log(TAG, `UIExtAbility onSessionDestroy`)
370
371    let extensionHostWindow = session.getUIExtensionHostWindowProxy();
372    let promise = extensionHostWindow.hideNonSecureWindows(false);
373    promise.then(()=> {
374      console.log(TAG, `Succeeded in showing the non-secure windows.`);
375    }).catch((err: BusinessError)=> {
376      console.log(TAG, `Failed to show the non-secure windows. Cause:${JSON.stringify(err)}`);
377    })
378  }
379}
380```
381
382## 示例
383
384在提供方中应用中,首先通过[UIExtensionContentSession](../apis-ability-kit/js-apis-app-ability-uiExtensionContentSession.md)接口获取到UIExtensionHostWindowProxy对象。
385
386```ts
387import UIExtensionAbility from '@ohos.app.ability.UIExtensionAbility'
388import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession'
389import Want from '@ohos.app.ability.Want';
390const TAG: string = '[UIExtAbility]'
391export default class UIExtAbility extends UIExtensionAbility {
392
393  onCreate() {
394    console.log(TAG, `UIExtAbility onCreate`)
395  }
396
397  onForeground() {
398    console.log(TAG, `UIExtAbility onForeground`)
399  }
400
401  onBackground() {
402    console.log(TAG, `UIExtAbility onBackground`)
403  }
404
405  onDestroy() {
406    console.log(TAG, `UIExtAbility onDestroy`)
407  }
408
409  onSessionCreate(want: Want, session: UIExtensionContentSession) {
410    let extensionHostWindow = session.getUIExtensionHostWindowProxy();
411    let storage: LocalStorage = new LocalStorage({
412        'session': session,
413        'extensionWindow': extensionHostWindow
414    });
415    session.loadContent('pages/extension', storage);
416  }
417
418  onSessionDestroy(session: UIExtensionContentSession) {
419    console.log(TAG, `UIExtAbility onSessionDestroy`)
420  }
421}
422```
423
424在具体的页面中
425
426```ts
427import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession'
428import uiExtensionHost from '@ohos.uiExtensionHost'
429import window from '@ohos.window'
430
431
432let storage = LocalStorage.getShared()
433
434@Entry(storage)
435@Component
436struct Hello {
437  private extensionWindow: uiExtensionHost.UIExtensionHostWindowProxy | undefined = storage.get<uiExtensionHost.UIExtensionHostWindowProxy>('extensionWindow');
438
439  build() {
440    Row() {
441      Column() {
442        Button("TYPE_SYSTEM").onClick(() => {
443          if (this.extensionWindow != undefined) {
444            let avoidArea: window.AvoidArea = this.extensionWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM)
445            console.log(`${JSON.stringify(avoidArea)}`)
446          }
447        })
448        Button("TYPE_CUTOUT").onClick(() => {
449          if (this.extensionWindow != undefined) {
450            let avoidArea: window.AvoidArea = this.extensionWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_CUTOUT)
451            console.log(`${JSON.stringify(avoidArea)}`)
452          }
453        })
454      }
455      .width('100%')
456    }
457    .height('100%')
458  }
459}
460```