鸿蒙5.0开发进阶:UI框架-ArkTS组件(EmbeddedComponent)

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


EmbeddedComponent

EmbeddedComponent用于支持在当前页面嵌入本应用内其他EmbeddedUIExtensionAbility提供的UI。EmbeddedUIExtensionAbility在独立进程中运行,完成页面布局和渲染。

通常用于有进程隔离诉求的模块化开发场景。

说明

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

使用约束

EmbeddedComponent仅支持在拥有多进程权限的设备上使用。

EmbeddedComponent只能在UIAbility中使用,且被拉起的EmbeddedUIExtensionAbility需与UIAbility属于同一应用。

子组件

接口

EmbeddedComponent(loader: Want, type: EmbeddedType)

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

参数:

参数名参数类型必填参数描述
loaderWant要加载的EmbeddedUIExtensionAbility。
typeEmbeddedType提供方的类型。

属性

支持通用属性

说明

EmbeddedComponent组件宽高默认值和最小值均为10vp, 不支持如下与宽高相关的属性:"constraintSize"、"aspectRatio"、"layoutWeight"、"flexBasis"、"flexGrow"和"flexShrink"。

事件

与屏幕坐标相关的事件信息会基于EmbeddedComponent的位置宽高进行坐标转换后传递给被拉起的EmbeddedUIExtensionAbility处理。

不支持点击等通用事件。仅支持以下事件:

onTerminated

onTerminated(callback: Callback<TerminationInfo>)

被拉起的EmbeddedUIExtensionAbility通过调用terminateSelfWithResult或者terminateSelf正常退出时,触发本回调函数。

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

参数:

参数名类型说明
callbackCallback<TerminationInfo>回调函数,入参用于接收EmbeddedUIExtensionAbility的返回结果,类型为TerminationInfo

说明

  • 若EmbeddedUIExtensionAbility通过调用terminateSelfWithResult退出,其携带的信息会传给回调函数的入参;
  • 若EmbeddedUIExtensionAbility通过调用terminateSelf退出,上述回调函数的入参中,"code"取默认值"0","want"为"undefined"。

onError

onError(callback: ErrorCallback)

被拉起的EmbeddedUIExtensionAbility在运行过程中发生异常时触发本回调。

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

参数:

参数名类型说明
callbackErrorCallback回调函数,入参用于接收异常信息,类型为BusinessError,可通过参数中的code、name和message获取错误信息并做处理。

说明

如下情形会触发本回调:

  • 通知提供方拉起EmbeddedUIExtensionAbility失败。
  • 通知提供方EmbeddedUIExtensionAbility切后台失败。
  • 通知提供方销毁EmbeddedUIExtensionAbility失败。
  • 提供方EmbeddedUIExtensionAbility异常退出。
  • 在EmbeddedUIExtensionAbility中嵌套使用EmbeddedComponent。

TerminationInfo

用于表示被拉起的EmbeddedUIExtensionAbility的返回结果。

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

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

属性

名称类型必填说明
codenumber被拉起EmbeddedUIExtensionAbility退出时返回的结果码。
wantWant被拉起EmbeddedUIExtensionAbility退出时返回的数据。

示例(加载EmbeddedComponent)

本示例展示EmbeddedComponent组件和EmbeddedUIExtensionAbility的基础使用方式,示例应用的bundleName为"com.example.embeddeddemo", 同应用下被拉起的EmbeddedUIExtensionAbility为"ExampleEmbeddedAbility"。本示例仅支持在拥有多进程权限的设备上运行,如2in1。

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

    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) => {
                // 点击extension页面内的terminateSelfWithResult按钮后触发onTerminated回调,文本框显示如下信息
                this.message = 'Termination: code = ' + info.code + ', want = ' + JSON.stringify(info.want);
              })
              .onError((error) => {
                // 失败或异常触发onError回调,文本框显示如下报错内容
                this.message = 'Error: code = ' + error.code;
              })
          }
          .width('100%')
        }
        .height('100%')
      }
    }
  • EmbeddedComponent拉起的ExampleEmbeddedAbility(EmbeddedUIExtensionAbility)在ets/extensionAbility/ExampleEmbeddedAbility.ets文件中实现,内容如下:

    import { EmbeddedUIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
    
    const TAG: string = '[ExampleEmbeddedAbility]'
    
    export default class ExampleEmbeddedAbility extends EmbeddedUIExtensionAbility {
      onCreate() {
        console.log(TAG, `onCreate`);
      }
    
      onForeground() {
        console.log(TAG, `onForeground`);
      }
    
      onBackground() {
        console.log(TAG, `onBackground`);
      }
    
      onDestroy() {
        console.log(TAG, `onDestroy`);
      }
    
      onSessionCreate(want: Want, session: UIExtensionContentSession) {
        console.log(TAG, `onSessionCreate, want: ${JSON.stringify(want)}`);
        let param: Record<string, UIExtensionContentSession> = {
          'session': session
        };
        let storage: LocalStorage = new LocalStorage(param);
        // 加载pages/extension.ets页面内容
        session.loadContent('pages/extension', storage);
      }
    
      onSessionDestroy(session: UIExtensionContentSession) {
        console.log(TAG, `onSessionDestroy`);
      }
    }
  • ExampleEmbeddedAbility(EmbeddedUIExtensionAbility)的入口页面文件ets/pages/extension.ets内容如下,同时需要在resources/base/profile/main_pages.json文件中配置该页面路径:

    import { UIExtensionContentSession } from '@kit.AbilityKit';
    
    let storage = LocalStorage.getShared()
    
    @Entry(storage)
    @Component
    struct Extension {
      @State message: string = 'EmbeddedUIExtensionAbility Index';
      private session: UIExtensionContentSession | undefined = storage.get<UIExtensionContentSession>('session');
    
      build() {
        Column() {
          Text(this.message)
            .fontSize(20)
            .fontWeight(FontWeight.Bold)
          Button("terminateSelfWithResult").fontSize(20).onClick(() => {
            // 点击按钮后调用terminateSelfWithResult退出
            this.session?.terminateSelfWithResult({
              resultCode: 1,
              want: {
                bundleName: "com.example.embeddeddemo",
                abilityName: "ExampleEmbeddedAbility",
              }
            });
          })
        }.width('100%').height('100%')
      }
    }
  • 在module.json5配置文件的"extensionAbilities"标签下增加ExampleEmbeddedAbility配置,其type类型为embeddedUI,具体内容如下:

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值