【鸿蒙next开发】ArkUI框架:UI界面-@ohos.arkui.uiExtension (uiExtension)

 往期鸿蒙5.0全套实战文章必看:(文中附带鸿蒙5.0全栈学习资料)


@ohos.arkui.uiExtension (uiExtension)

用于EmbeddedUIExtensionAbility(或UIExtensionAbility)中获取宿主应用的窗口信息或对应的EmbeddedComponent组件的信息。

说明

从API Version 12开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

导入模块

import { uiExtension } from '@kit.ArkUI'

WindowProxy

getWindowAvoidArea

getWindowAvoidArea(type: window.AvoidAreaType): window.AvoidArea

获取宿主应用窗口内容规避的区域;如系统栏区域、刘海屏区域、手势区域、软键盘区域等与宿主窗口内容重叠时,需要宿主窗口内容避让的区域。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力:SystemCapability.ArkUI.ArkUI.Full

参数名类型必填说明
typewindow.AvoidAreaType表示规避区类型。

返回值:

类型说明
window.AvoidArea宿主窗口内容规避区域。

错误码

以下错误码详细介绍。

错误码ID错误信息
401Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.

示例

// ExtensionProvider.ts
import { EmbeddedUIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';

export default class EntryAbility extends EmbeddedUIExtensionAbility {
  onSessionCreate(want: Want, session: UIExtensionContentSession) {
    const extensionWindow = session.getUIExtensionWindowProxy();
    // 获取宿主应用窗口的避让信息
    let avoidArea: window.AvoidArea | undefined = extensionWindow?.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);
    console.info(`avoidArea: ${JSON.stringify(avoidArea)}`);
  }
}

on('avoidAreaChange')

on(type: 'avoidAreaChange', callback: Callback<AvoidAreaInfo>): void

注册系统规避区变化的监听。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力:SystemCapability.ArkUI.ArkUI.Full

参数名类型必填说明
typestring监听的事件类型,固定为'avoidAreaChange',即系统规避区变化事件。
callbackCallback<AvoidAreaInfo>回调函数:入参用于接收当前规避区的信息。

错误码

以下错误码详细介绍。

错误码ID错误信息
401Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.

示例

// ExtensionProvider.ts
import { EmbeddedUIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
import { uiExtension } from '@kit.ArkUI';

export default class EntryAbility extends EmbeddedUIExtensionAbility {
  onSessionCreate(want: Want, session: UIExtensionContentSession) {
    const extensionWindow = session.getUIExtensionWindowProxy();
    // 注册避让区变化的监听
    extensionWindow.on('avoidAreaChange', (info: uiExtension.AvoidAreaInfo) => {
      console.info(`The avoid area of the host window is: ${JSON.stringify(info.area)}.`);
    });
  }
}

off('avoidAreaChange')

off(type: 'avoidAreaChange', callback?: Callback<AvoidAreaInfo>): void

注销系统规避区变化的监听。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力:SystemCapability.ArkUI.ArkUI.Full

参数名类型必填说明
typestring注销的事件类型,固定为'avoidAreaChange',即系统规避区变化事件。
callbackCallback<AvoidAreaInfo>回调函数:如果传入该参数,则关闭该监听。如果未传入参数,则关闭所有系统规避区变化的监听。

错误码

以下错误码详细介绍。

错误码ID错误信息
401Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.

示例

// ExtensionProvider.ts
import { EmbeddedUIExtensionAbility, UIExtensionContentSession } from '@kit.AbilityKit';

export default class EntryAbility extends EmbeddedUIExtensionAbility {
  onSessionDestroy(session: UIExtensionContentSession) {
    const extensionWindow = session.getUIExtensionWindowProxy();
    // 注销所有避让区变化的监听
    extensionWindow.off('avoidAreaChange');
  }
}

on('windowSizeChange')

on(type: 'windowSizeChange', callback: Callback<window.Size>): void

注册宿主应用窗口尺寸变化的监听。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力:SystemCapability.ArkUI.ArkUI.Full

参数名类型必填说明
typestring监听的事件类型,固定为'windowSizeChange',即窗口尺寸变化事件。
callbackCallback<window.Size>回调函数:入参用于接收当前窗口的尺寸。

错误码

以下错误码详细介绍。

错误码ID错误信息
401Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.

示例

// ExtensionProvider.ts
import { EmbeddedUIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';

export default class EntryAbility extends EmbeddedUIExtensionAbility {
  onSessionCreate(want: Want, session: UIExtensionContentSession) {
    const extensionWindow = session.getUIExtensionWindowProxy();
    // 注册宿主应用窗口大小变化的监听
    extensionWindow.on('windowSizeChange', (size: window.Size) => {
      console.info(`The avoid area of the host window is: ${JSON.stringify(size)}.`);
    });
  }
}

off('windowSizeChange')

off(type: 'windowSizeChange', callback?: Callback<window.Size>): void

注销宿主应用窗口尺寸变化的监听。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力:SystemCapability.ArkUI.ArkUI.Full

参数名类型必填说明
typestring注销的事件类型,固定值:'windowSizeChange',即窗口尺寸变化事件。
callbackCallback<window.Size>回调函数:如果传入该参数,则关闭该监听。如果未传入参数,则关闭所有系统规避区变化的监听。

错误码

以下错误码详细介绍。

错误码ID错误信息
401Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.

示例

// ExtensionProvider.ts
import { EmbeddedUIExtensionAbility, UIExtensionContentSession } from '@kit.AbilityKit';

export default class EntryAbility extends EmbeddedUIExtensionAbility {
  onSessionDestroy(session: UIExtensionContentSession) {
    const extensionWindow = session.getUIExtensionWindowProxy();
    // 注销宿主应用窗口大小变化的监听
    extensionWindow.off('windowSizeChange');
  }
}

createSubWindowWithOptions

createSubWindowWithOptions(name: string, subWindowOptions: window.SubWindowOptions): Promise<window.Window>

创建该WindowProxy实例下的子窗口,使用Promise异步回调。

系统能力: SystemCapability.ArkUI.ArkUI.Full

元服务API: 从API version 12开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

参数:

参数名类型必填说明
namestring子窗口的名字。
subWindowOptionswindow.SubWindowOptions子窗口参数。

返回值:

类型说明
Promise<window.Window>Promise对象。返回当前WindowProxy下创建的子窗口对象。

错误码:

以下错误码的详细介绍。

错误码ID错误信息
401Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.
801Capability not supported. Failed to call the API due to limited device capabilities.
1300002This window state is abnormal.
1300005This window proxy is abnormal.

示例:

// ExtensionProvider.ts
import { EmbeddedUIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

export default class EntryAbility extends EmbeddedUIExtensionAbility {
  onSessionCreate(want: Want, session: UIExtensionContentSession) {
    const extensionWindow = session.getUIExtensionWindowProxy();
    const subWindowOpts: window.SubWindowOptions = {
      title: 'This is a subwindow',
      decorEnabled: true
    };
    // 创建子窗口
    extensionWindow.createSubWindowWithOptions('subWindowForHost', subWindowOpts)
      .then((subWindow: window.Window) => {
        subWindow.setUIContent('pages/Index', (err, data) =>{
          if (err && err.code != 0) {
            return;
          }
          subWindow?.resize(300, 300, (err, data)=>{
            if (err && err.code != 0) {
              return;
            }
            subWindow?.moveWindowTo(100, 100, (err, data)=>{
              if (err && err.code != 0) {
                return;
              }
              subWindow?.showWindow((err, data) => {
                if (err && err.code == 0) {
                  console.info(`The subwindow has been shown!`);
                } else {
                  console.error(`Failed to show the subwindow!`);
                }
              });
            });
          });
        });
      }).catch((error: BusinessError) => {
        console.error(`Create subwindow failed: ${JSON.stringify(error)}`);
      })
  }
}

AvoidAreaInfo

用于表示窗口规避区的信息。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力:SystemCapability.ArkUI.ArkUI.Full

名称类型必填说明
typewindow.AvoidAreaType窗口规避区类型。
areawindow.AvoidArea窗口内容规避区域。

完整示例

本示例展示文档中所有API在EmbeddedUIExtensionAbility中的基础使用方式,示例应用的bundleName为"com.example.embeddeddemo", 被拉起的EmbeddedUIExtensionAbility为"ExampleEmbeddedAbility".

  • 示例应用中的EntryAbility(UIAbility)加载首页文件:pages/Index.ets,其中内容如下:

    // pages/Index.ets -- UIAbility启动时加载此页面
    import { Want } from '@kit.AbilityKit';
    
    @Entry
    @Component
    struct Index {
      @State message: string = 'Message: '
      private want: Want = {
        bundleName: "com.example.embeddeddemo",
        abilityName: "ExampleEmbeddedAbility",
      }
    
      build() {
        Row() {
          Column() {
            Text(this.message).fontSize(30)
            EmbeddedComponent(this.want, EmbeddedType.EMBEDDED_UI_EXTENSION)
              .width('100%')
              .height('90%')
              .onTerminated((info)=>{
                this.message = 'Termination: code = ' + info.code + ', want = ' + JSON.stringify(info.want);
              })
              .onError((error)=>{
                this.message = 'Error: code = ' + error.code;
              })
          }
          .width('100%')
        }
        .height('100%')
      }
    }
  • EmbeddedComponent拉起的EmbeddedUIExtensionAbility在ets/extensionAbility/ExampleEmbeddedAbility文件中实现,内容如下:

    import { EmbeddedUIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
    
    const TAG: string = '[ExampleEmbeddedAbility]'
    export default class ExampleEmbeddedAbility extends EmbeddedUIExtensionAbility {
      
      onCreate() {
        console.info(TAG, `onCreate`);
      }
    
      onForeground() {
        console.info(TAG, `onForeground`);
      }
    
      onBackground() {
        console.info(TAG, `onBackground`);
      }
    
      onDestroy() {
        console.info(TAG, `onDestroy`);
      }
    
      onSessionCreate(want: Want, session: UIExtensionContentSession) {
        console.info(TAG, `onSessionCreate, want: ${JSON.stringify(want)}`);
        let param: Record<string, UIExtensionContentSession> = {
          'session': session
        };
        let storage: LocalStorage = new LocalStorage(param);
        session.loadContent('pages/extension', storage);
      }
    }
  • EmbeddedUIExtensionAbility的入口页面文件pages/extension.ets内容如下:

    import { UIExtensionContentSession } from '@kit.AbilityKit';
    import { uiExtension, window } from '@kit.ArkUI';
    import { BusinessError } from '@kit.BasicServicesKit';
    let storage = LocalStorage.getShared()
    
    @Entry(storage)
    @Component
    struct Extension {
      @State message: string = 'EmbeddedUIExtensionAbility Index';
      private session: UIExtensionContentSession | undefined = storage.get<UIExtensionContentSession>('session');
      private extensionWindow: uiExtension.WindowProxy | undefined = this.session?.getUIExtensionWindowProxy();
      private subWindow: window.Window | undefined = undefined;
    
      aboutToAppear(): void {
        this.extensionWindow?.on('windowSizeChange', (size: window.Size) => {
            console.info(`size = ${JSON.stringify(size)}`);
        });
        this.extensionWindow?.on('avoidAreaChange', (info: uiExtension.AvoidAreaInfo) => {
            console.info(`type = ${JSON.stringify(info.type)}, area = ${JSON.stringify(info.area)}`);
        });
      }
    
      aboutToDisappear(): void {
        this.extensionWindow?.off('windowSizeChange');
        this.extensionWindow?.off('avoidAreaChange');
      }
    
      build() {
        Column() {
          Text(this.message)
            .fontSize(20)
            .fontWeight(FontWeight.Bold)
          Button("获取系统规避区信息").width('90%').margin({top: 5, bottom: 5}).fontSize(16).onClick(() => {
            let avoidArea: window.AvoidArea | undefined = this.extensionWindow?.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);
            console.info(`系统规避区: ${JSON.stringify(avoidArea)}`);
          })
          Button("创建子窗口").width('90%').margin({top: 5, bottom: 5}).fontSize(16).onClick(() => {
            let subWindowOpts: window.SubWindowOptions = {
                'title': 'This is a subwindow',
                decorEnabled: true
            };
            this.extensionWindow?.createSubWindowWithOptions('subWindowForHost', subWindowOpts)
                .then((subWindow: window.Window) => {
                    this.subWindow = subWindow;
                    this.subWindow.loadContent('pages/Index', storage, (err, data) =>{
                        if (err && err.code != 0) {
                            return;
                        }
                        this.subWindow?.resize(300, 300, (err, data)=>{
                            if (err && err.code != 0) {
                                return;
                            }
                            this.subWindow?.moveWindowTo(100, 100, (err, data)=>{
                                if (err && err.code != 0) {
                                    return;
                                }
                                this.subWindow?.showWindow((err, data) => {
                                    if (err && err.code == 0) {
                                        console.info(`The subwindow has been shown!`);
                                    } else {
                                        console.error(`Failed to show the subwindow!`);
                                    }
                                });
                            });
                        });
                    });
                }).catch((error: BusinessError) => {
                    console.error(`Create subwindow failed: ${JSON.stringify(error)}`);
                })
          })
        }.width('100%').height('100%')
      }
    }
  • 最后,示例应用的module.json5中的"extensionAbilities"中需要增加一项,具体内容如下:

    {
      "name": "ExampleEmbeddedAbility",
      "srcEntry": "./ets/extensionAbility/ExampleEmbeddedAbility.ets",
      "type": "embeddedUI"
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值