• HarmonyOS Next开发学习手册——ExtensionAbility


    概述

    EmbeddedUIExtensionAbility 是EMBEDDED_UI类型的ExtensionAbility组件,提供了跨进程界面嵌入的能力。

    EmbeddedUIExtensionAbility需要和 EmbeddedComponent 一起配合使用,开发者可以在UIAbility的页面中通过EmbeddedComponent嵌入本应用的EmbeddedUIExtensionAbility提供的UI。EmbeddedUIExtensionAbility会在独立于UIAbility的进程中运行,完成其页面的布局和渲染。通常用于有进程隔离诉求的模块化开发场景。

    说明

    1. 当前EmbeddedUIExtensionAbility和EmbeddedComponent仅支持在拥有多进程配置的设备上使用。
    2. EmbeddedComponent只能在UIAbility中使用,且被拉起的EmbeddedUIExtensionAbility需与UIAbility属于同一应用。
    3. 当前提供的EmbeddedUIExtensionAbility支持多实例场景,并且继承了UIExtensionAbility的进程模型。

    EmbeddedUIExtensionAbility通过 UIExtensionContext 和 UIExtensionContentSession 提供相关能力。本文描述中称被启动的EmbeddedUIExtensionAbility为提供方,称启动EmbeddedUIExtensionAbility的EmbeddedComponent组件为使用方。

    开发EmbeddedUIExtensionAbility提供方

    生命周期

    EmbeddedUIExtensionAbility 提供了onCreate、onSessionCreate、onSessionDestroy、onForeground、onBackground和onDestroy生命周期回调,根据需要重写对应的回调方法。

    • onCreate:当EmbeddedUIExtensionAbility创建时回调,执行初始化业务逻辑操作。
    • onSessionCreate:当EmbeddedUIExtensionAbility界面内容对象创建后调用。
    • onSessionDestroy:当EmbeddedUIExtensionAbility界面内容对象销毁后调用。
    • onForeground:当EmbeddedUIExtensionAbility从后台转到前台时触发。
    • onBackground:当EmbeddedUIExtensionAbility从前台转到后台时触发。
    • onDestroy:当EmbeddedUIExtensionAbility销毁时回调,可以执行资源清理等操作。

    开发步骤

    开发者在实现一个EmbeddedUIExtensionAbility提供方时,需要在DevEco Studio工程中手动新建一个EmbeddedUIExtensionAbility,具体步骤如下。

    1. 在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为EmbeddedUIExtAbility。

    2. 在EmbeddedUIExtAbility目录,右键选择“New > File”,新建一个.ts文件并命名为EmbeddedUIExtAbility.ts。

    3. 打开EmbeddedUIExtAbility.ts文件,导入EmbeddedUIExtensionAbility的依赖包,自定义类继承EmbeddedUIExtensionAbility并实现onCreate、onSessionCreate、onSessionDestroy、onForeground、onBackground和onDestroy生命周期回调。

    import EmbeddedUIExtensionAbility from '@ohos.app.ability.EmbeddedUIExtensionAbility'
    import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession'
    import Want from '@ohos.app.ability.Want';
    
    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 = {
          'session': session
        };
        let storage: LocalStorage = new LocalStorage(param);
        session.loadContent('pages/extension', storage);
      }
    
      onSessionDestroy(session: UIExtensionContentSession) {
        console.log(TAG, `onSessionDestroy`);
      }
    }
    
    1. EmbeddedUIExtensionAbility的onSessionCreate中加载了入口页面文件pages/extension.ets内容如下:
    import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession';
    
    let storage = LocalStorage.getShared()
    
    @Entry(storage)
    @Component
    struct Extension {
      @State message: string = 'EmbeddedUIExtensionAbility Index';
      private session: UIExtensionContentSession | undefined = storage.get('session');
    
      build() {
        Column() {
          Text(this.message)
            .fontSize(20)
            .fontWeight(FontWeight.Bold)
          Button("terminateSelfWithResult").fontSize(20).onClick(() => {
            this.session?.terminateSelfWithResult({
              resultCode: 1,
              want: {
                bundleName: "com.example.embeddeddemo",
                abilityName: "ExampleEmbeddedAbility",
              }});
          })
        }.width('100%').height('100%')
      }
    }
    
    1. 在工程Module对应的 module.json5配置文件 中注册EmbeddedUIExtensionAbility,type标签需要设置为“embeddedUI”,srcEntry标签表示当前EmbeddedUIExtensionAbility组件所对应的代码路径。
    {
      "module": {
        "extensionAbilities": [
          {
            "name": "EmbeddedUIExtAbility",
            "icon": "$media:icon",
            "description": "EmbeddedUIExtAbility",
            "type": "embeddedUI",
            "srcEntry": "./ets/EmbeddedUIExtAbility/EmbeddedUIExtAbility.ts"
          },
        ]
      }
    }
    

    开发EmbeddedUIExtensionAbility使用方

    开发者可以在UIAbility的页面中通过EmbeddedComponent容器加载自己应用内的EmbeddedUIExtensionAbility。此外,EmbeddedUIExtensionAbility在want.parameters中新增了两个字段ohos.extension.processMode.hostSpecified和ohos.extension.processMode.hostInstance。

    • ohos.extension.processMode.hostSpecified控制非首次启动的EmbeddedUIExtensionAbility是否运行在同UIExtensionAbility的进程中,参数是进程名称。例如,“ohos.extension.processMode.hostSpecified”: “com.ohos.inentexecutedemo:share”。
    • ohos.extension.processMode.hostInstance控制启动的EmbeddedUIExtensionAbility是否按照独立进程启动,传入false时,按照UIExtensionAbility的进程模型启动,入参true的时候,不管被拉起的UIExtensionAbility配置的是什么进程模型,都会新增一个进程,例如,“ohos.extension.processMode.hostInstance”: “true”。

    ohos.extension.processMode.hostSpecified和ohos.extension.processMode.hostInstance同时配置时,hostSpecified优先,会运行在指定的进程中。

    如在首页文件:pages/Index.ets中添加如下内容:

    import { Want } from '@kit.AbilityKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    
    @Entry
    @Component
    struct Index {
      @State message: string = 'Message: '
      private want: Want = {
        bundleName: "com.example.embeddeddemo",
        abilityName: "EmbeddedUIExtAbility",
        parameters: {
          'ohos.extension.processMode.hostInstance': 'true'
        }
      }
    
      build() {
        Row() {
          Column() {
            Text(this.message).fontSize(30)
            EmbeddedComponent(this.want, EmbeddedType.EMBEDDED_UI_EXTENSION)
              .width('100%')
              .height('90%')
              .onTerminated((info: TerminationInfo) => {
                this.message = 'Terminarion: code = ' + info.code + ', want = ' + JSON.stringify(info.want);
              })
              .onError((error: BusinessError) => {
                this.message = 'Error: code = ' + error.code;
              })
          }
          .width('100%')
        }
        .height('100%')
      }
    }
    

    鸿蒙全栈开发全新学习指南

    也为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线【包含了大厂APP实战项目开发】

    本路线共分为四个阶段

    第一阶段:鸿蒙初中级开发必备技能

    在这里插入图片描述

    第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH

    第三阶段:应用开发中高级就业技术

    第四阶段:全网首发-工业级南向设备开发就业技术:gitee.com/MNxiaona/733GH

    鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH

    写在最后

    • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
    • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
    • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
    • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:gitee.com/MNxiaona/733GH

  • 相关阅读:
    JVM原理及优化_垃圾回收器
    3.71 OrCAD新建原理图时,每一个类目的含义是什么?OrCAD软件怎么显示元器件的封装名称?
    用git给github私有仓库上传文件
    北大青鸟昌平校区:学软件测试有年龄限制吗?
    学习MySQL必须掌握的13个关键字,你get了吗?
    【基于Thread多线程+随机数(Random)+java版本JDBC手动提交事务+EasyExcel读取excel文件,向数据库生成百万级别模拟数据】
    AI极客日报0906 – Twitter更新隐私政策,开始用用户数据训练AI模型;每日GPT教程:如何用ChatGPT生成创新性想法
    控制系统分析2(线性系统稳定性、和可控性)
    Scalable Time Series Compound Infrastructure(sigmod2020)
    NISP中渗透测试面试方式
  • 原文地址:https://blog.csdn.net/maniuT/article/details/139926305