鸿蒙Ability Kit(程序框架服务)【UIExtensionAbility】

UIExtensionAbility

概述

[UIExtensionAbility]是UI类型的ExtensionAbility组件,需要与[UIExtensionComponent]一起配合使用,开发者可以在UIAbility的页面中通过UIExtensionComponent嵌入提供方应用的UIExtensionAbility提供的UI。UIExtensionAbility会在独立于UIAbility的进程中运行,完成其页面的布局和渲染。常用于有进程隔离诉求的系统弹窗、状态栏、胶囊等模块化开发的场景。

说明:

当前UIExtensionAbility和UIExtensionComponent仅支持系统应用使用。

生命周期

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

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

选择合适的UIExtensionAbility进程模型

UIExtensionAbility支持多实例,每个嵌入式显示对应一个UIExtensionAbility实例。多实例场景下默认是多进程,可配置多进程模型。 UIExtensionAbility支持多实例,每个嵌入式显示对应一个UIExtensionAbility实例。 当应用中存在多个UIExtensionAbility实例,这些实例可以为多个独立进程,也可以共用同一个进程,还可以分为多组、同组实例共用同一个进程。通过module.json5配置文件中的extensionProcessMode字段,即可为选择对应的进程模型,三种模型对比如下:

进程模型extensionProcessMode字段配置说明
同一bundle中所有UIExtensionAbility共进程bundleUIExtensionAbility实例之间的通信无需跨IPC通信;实例之间的状态不独立,会存在相互影响。
相同name的UIExtensionAbility共进程type将同UIExtensionAbility类配置在同一个进程下,便于应用针对UIExtensionAbility类型对实例进行管理。
每个UIExtensionAbility为独立进程instanceUIExtensionAbility实例之间的状态不会彼此影响,安全性更高;实例之间只能通过跨进程进行通信。

Bundle中的所有UIExtensionAbility共进程

同一个bundle下的UIExtensionAbility配置在同一个进程中,便于多实例间的通信。需要关注的是,各个实例之间的状态会彼此影响,当进程中的一个实例异常退出,将导致进程中所有的实例也都会退出;

图1 bundle模型配置示意图
uiextability-bundle-processmodel

Index.ets示例代码如下:

@Entry
@Component
struct Index {@State message: string = 'UIExtension UserA';private myProxy: UIExtensionProxy | undefined = undefined;build() {Row() {Column() {Text(this.message).fontSize(30).size({ width: '100%', height: '50'}).fontWeight(FontWeight.Bold).textAlign(TextAlign.Center)UIExtensionComponent({bundleName: 'com.samples.uiextensionability',abilityName: 'UIExtensionProvider',moduleName: 'entry',parameters: {'ability.want.params.uiExtensionType': 'sys/commonUI',}}).onRemoteReady((proxy) => {this.myProxy = proxy;}).onReceive((data) => {this.message = JSON.stringify(data);}).onResult((data) => {this.message = JSON.stringify(data);}).onRelease((code) => {this.message = "release code:" + code;}).offset({ x: 0, y: 10}).size({ width: 300, height: 300}).border({ width: 5, color: 0x317AF7, radius: 10, style: BorderStyle.Dotted})UIExtensionComponent({bundleName: 'com.samples.uiextension2',abilityName: 'UIExtensionProviderB',moduleName: 'entry',parameters: {'ability.want.params.uiExtensionType': 'sys/commonUI',}}).onRemoteReady((proxy) => {this.myProxy = proxy;}).onReceive((data) => {this.message = JSON.stringify(data);}).onResult((data) => {this.message = JSON.stringify(data);}).onRelease((code) => {this.message = "release code:" + code;}).offset({ x: 0, y: 50}).size({ width: 300, height: 300}).border({ width: 5, color: 0x317AF7, radius: 10, style: BorderStyle.Dotted})}.width('100%')}.height('100%')}
}

图2 根据上述代码,生成的Index页面如下:
uiextension-bundle-example

采用该进程模型,进程名格式为: process name [{bundleName}:{UIExtensionAbility的类型}] 例如,process name [com.ohos.intentexecutedemo:xxx]。 图3 进程模型展示
uiextension-bundle-process-example

同UIExtensionAbility类的所有UIExtensionAbility共进程

根据UIExtensionAbility类进行分配进程,拉起多个同样的UIExtensionAbility实例时,这些实例将配置在同一个进程中。将同UIExtensionAbility类配置在同一个进程下,方便应用针对UIExtensionAbility类型对实例进行管理;

图4 type模型配置示意图
uiextability-type-processmodel

Index.ets示例代码如下:

@Entry
@Component
struct Index {@State message: string = 'UIExtension User';private myProxy: UIExtensionProxy | undefined = undefined;build() {Row() {Column() {Text(this.message).fontSize(30).size({ width: '100%', height: '50'}).fontWeight(FontWeight.Bold).textAlign(TextAlign.Center)UIExtensionComponent({bundleName: 'com.samples.uiextensionability',abilityName: 'UIExtensionProviderA',moduleName: 'entry',parameters: {'ability.want.params.uiExtensionType': 'sys/commonUI',}}).onRemoteReady((proxy) => {this.myProxy = proxy;}).onReceive((data) => {this.message = JSON.stringify(data);}).onResult((data) => {this.message = JSON.stringify(data);}).onRelease((code) => {this.message = "release code:" + code;}).offset({ x: 0, y: 10}).size({ width: 300, height: 300}).border({ width: 5, color: 0x317AF7, radius: 10, style: BorderStyle.Dotted})UIExtensionComponent({bundleName: 'com.samples.uiextensionability',abilityName: 'UIExtensionProviderB',moduleName: 'entry',parameters: {'ability.want.params.uiExtensionType': 'sys/commonUI',}}).onRemoteReady((proxy) => {this.myProxy = proxy;}).onReceive((data) => {this.message = JSON.stringify(data);}).onResult((data) => {this.message = JSON.stringify(data);}).onRelease((code) => {this.message = "release code:" + code;}).offset({ x: 0, y: 50}).size({ width: 300, height: 300}).border({ width: 5, color: 0x317AF7, radius: 10, style: BorderStyle.Dotted})}.width('100%')}.height('100%')}
}

图5 根据上述代码,生成的Index页面如下:
uiextability-type-example

采用该进程模型,进程名格式为: process name [{bundleName}:{UIExtensionAbility名}] 例如,process name [com.ohos.intentexecutedemo:xxx]。 图6 进程模型展示
uiextability-type-process-example

UIExtensionAbility实例独立进程

根据UIExtensionAbility实例进行分配进程,配置了instance的UIExtensionAbility实例,将每个实例独立一个进程。独立进程的场景下,UIExtensionAbility实例之间只能通过跨进程进行通信,但实例之间的状态不会彼此影响,安全性更高;

图7 instance模型配置示意图
uiextability-instance-processmodel

Index.ets示例代码如下:

@Entry
@Component
struct Index {@State message: string = 'UIExtension User'private myProxy: UIExtensionProxy | undefined = undefined;build() {Row() {Column() {Text(this.message).fontSize(30).size({ width: '100%', height: '50'}).fontWeight(FontWeight.Bold).textAlign(TextAlign.Center)UIExtensionComponent({bundleName: 'com.samples.uiextensionability',abilityName: 'UIExtensionProvider',moduleName: 'entry',parameters: {'ability.want.params.uiExtensionType': 'sys/commonUI',}}).onRemoteReady((proxy) => {this.myProxy = proxy;}).onReceive((data) => {this.message = JSON.stringify(data);}).onResult((data) => {this.message = JSON.stringify(data);}).onRelease((code) => {this.message = "release code:" + code;}).offset({ x: 0, y: 10}).size({ width: 300, height: 300}).border({ width: 5, color: 0x317AF7, radius: 10, style: BorderStyle.Dotted})UIExtensionComponent({bundleName: 'com.samples.uiextensionability',abilityName: 'UIExtensionProvider',moduleName: 'entry',parameters: {'ability.want.params.uiExtensionType': 'sys/commonUI',}}).onRemoteReady((proxy) => {this.myProxy = proxy;}).onReceive((data) => {this.message = JSON.stringify(data);}).onResult((data) => {this.message = JSON.stringify(data);}).onRelease((code) => {this.message = "release code:" + code;}).offset({ x: 0, y: 50}).size({ width: 300, height: 300}).border({ width: 5, color: 0x317AF7, radius: 10, style: BorderStyle.Dotted})}.width('100%')}.height('100%')}
}

图8 根据上述代码,生成的Index页面如下:
uiextability-instance-example

采用该进程模型,进程名格式为: process name [{bundleName}:{UIExtensionAbility的类型}: {实例后缀}] 例如,process name [com.ohos.intentexecutedemo:xxx:n]。 图9 进程模型展示
uiextability-instance-process-example

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

开发步骤

为了便于表述,本例中将提供UIExtensionAbility能力的一方称为提供方,将启动UIExtensionAbility的一方称为使用方,本例中使用方通过UIExtensionComponent容器启动UIExtensionAbility。

开发UIExtensionAbility提供方

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

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

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

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

    import Want from '@ohos.app.ability.Want';
    import UIExtensionAbility from '@ohos.app.ability.UIExtensionAbility';
    import UIExtensionContentSession from '@ohos.app.ability.    UIExtensionContentSession';const TAG: string = '[testTag] UIExtAbility 'export default class UIExtAbility extends UIExtensionAbility {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 storage: LocalStorage = new LocalStorage();storage.setOrCreate('session', session);session.loadContent('pages/Extension',storage);}onSessionDestroy(session: UIExtensionContentSession) {console.log(TAG, `onSessionDestroy`);}
    }
    
  4. UIExtensionAbility的onSessionCreate中加载了入口页面文件pages/extension.ets, 并在entry\src\main\resources\base\profile\main_pages.json文件中添加"pages/Extension"声明,extension.ets内容如下:

    import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession';let storage = LocalStorage.GetShared();
    const TAG: string = `[testTag] ExtensionPage`;@Entry(storage)
    @Component
    struct Extension {@State message: string = `UIExtension provider`;private session: UIExtensionContentSession | undefined = storage.get<UIExtensionContentSession>('session');onPageShow() {console.info(TAG, 'show');}build() {Row() {Column() {Text(this.message).fontSize(30).fontWeight(FontWeight.Bold).textAlign(TextAlign.Center)Button("send data").width('80%').type(ButtonType.Capsule).margin({top:20}).onClick(() => {this.session?.sendData({ "data": 543321});})Button("terminate self").width('80%').type(ButtonType.Capsule).margin({top:20}).onClick(() => {this.session?.terminateSelf();storage.clear();})Button("terminate self with result").width('80%').type(ButtonType.Capsule).margin({top:20}).onClick(() => {this.session?.terminateSelfWithResult({resultCode: 0,want: {bundleName:"com.example.uiextensiondemo",parameters: { "result": 123456 }}})})}}.height('100%')}
    }
    
  5. 在工程Module对应的[module.json5配置文件]中注册UIExtensionAbility,type标签需要设置为UIExtensionAbility中配置的对应类型,srcEntry标签表示当前UIExtensionAbility组件所对应的代码路径。extensionProcessMode标签标识多实例的进程模型,此处以"bundle"为例。

    {"module": {"extensionAbilities": [{"name": "UIExtensionProvider","srcEntry": "./ets/uiextensionability/UIExtensionAbility.ets","description": "UIExtensionAbility","type": "sys/commonUI","exported": true,"extensionProcessMode": "bundle"},]}
    }
    

开发UIExtensionAbility使用方

开发者可以在UIAbility的页面中通过UIExtensionComponent容器加载自己应用内的UIExtensionAbility。 如在首页文件:pages/Index.ets中添加如下内容:

@Entry
@Component
struct Index {@State message: string = 'UIExtension User';private myProxy: UIExtensionProxy | undefined = undefined;build() {Row() {Column() {Text(this.message).fontSize(30).size({ width: '100%', height: '50'}).fontWeight(FontWeight.Bold).textAlign(TextAlign.Center)UIExtensionComponent({bundleName: 'com.example.uiextensiondemo',abilityName: 'UIExtensionProvider',moduleName: 'entry',parameters: {'ability.want.params.uiExtensionType': 'sys/commonUI',}}).onRemoteReady((proxy) => {this.myProxy = proxy;}).onReceive((data) => {this.message = JSON.stringify(data);}).onResult((data) => {this.message = JSON.stringify(data);}).onRelease((code) => {this.message = "release code:" + code;}).offset({ x: 0, y: 30}).size({ width: 300, height: 300}).border({ width: 5, color: 0x317AF7, radius: 10, style: BorderStyle.Dotted})Button("sendData").type(ButtonType.Capsule).offset({ x: 0,y: 60}).width('80%').type(ButtonType.Capsule).margin({top: 20}).onClick(() => {this.myProxy?.send({"data": 123456,"message": "data from component"})})}.width('100%')}.height('100%')}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

匈牙利匹配算法

一 什么是匈牙利匹配算法 匈牙利算法是一种解决二分图最大匹配问题的算法。在二分图中&#xff0c;将左边的点称为X集合&#xff0c;将右边的点称为Y集合&#xff0c;我们需要在X集合和Y集合之间建立一个双向边集合&#xff0c;使得所有的边都不相交。如果我们能够找到一个最大…

C++ Thread多线程并发记录(8)生产者-消费者模型与信号量(条件变量)

一.生产者-消费者模型 生产者-消费者模型是一个十分经典的多线程并发协作模式。所谓的生产者-消费者&#xff0c;实际上包含了两类线程&#xff0c;一种是生产者线程用于生产数据&#xff0c;另一种是消费者线程用于消费数据&#xff0c;为了解耦生产者和消费者的关系&#xff…

Opencv 色彩空间

一 核心知识 色彩空间变换&#xff1b; 像素访问&#xff1b; 矩阵的、-、*、、&#xff1b; 基本图形的绘制 二 颜色空间 RGB&#xff1a;人眼的色彩空间&#xff1b; OpenCV默认使用BGR&#xff1b; HSV/HSB/HSL; YUV(视频); 1 RGB 2 BGR 图像的多种属性 1 访问图像(Ma…

人工智能大模型的进化之路:探索如何让它们变得更“聪明”

一、引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;大模型凭借其强大的处理能力和广泛的应用前景&#xff0c;已经成为研究的热点。然而&#xff0c;尽管这些模型在多个领域展现出了惊人的能力&#xff0c;但它们仍然面临着理解力、泛化能力和适应性等方面的挑战…

学习Java的日子 Day51 数据库,DDL,DML

Day51 MySQL 1.数据库 数据库&#xff08;database&#xff09;就是一个存储数据的仓库。为了方便数据的存储和管理&#xff0c;它将数据按照特定的规律存储在磁盘上。通过数据库管理系统&#xff0c;可以有效地组织和管理存储在数据库中的数据 MySQL就是数据库管理系统&#…

VisionPro界面乱序或字体排版异常,字体不适应界面窗口大小

很多人在安装Visionpro后都遇到了一个界面显示异常的问题&#xff1a; 打开visionpro后字体大小不统一,显示不全或显示在其他窗口之上&#xff0c;如下所示。 解决该问题&#xff0c;首先关闭Visionpro软件&#xff0c;右击软件选择属性->兼容性。勾选兼容模式下面的方框。…

WebStorm 2024.1.1 Mac激活码 前端开发工具集成开发环境(IDE)

WebStorm 2024 Mac激活码 搜索Mac软件之家下载WebStorm 2024 Mac激活版 WebStorm 2024 功能介绍 WebStorm 2024是由JetBrains公司开发的一款专为前端开发设计的集成开发环境&#xff08;IDE&#xff09;。它提供了一整套功能&#xff0c;旨在提高Web开发者的工作效率和代码质…

线性电源运放驱动调整管的方案仿真

群里有人的电路板做出来电压不稳&#xff0c;加负载就掉电压。我对这个运放的工作状态不是很理解&#xff0c;所以仿真了一下。结果却是稳定的。他用12v给运放供电&#xff0c;要求输出10.5. 从仿真看。12运放供电只能输出9v。而且还是到了运放的极限。所以通过仿真后确定怀疑路…

LLM的基础模型4:初识Embeddings

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

软件安全测评之漏洞扫描、代码审计详情介绍

在当今数字化时代&#xff0c;软件已渗透到我们生活的方方面面。然而&#xff0c;与软件的广泛应用相伴随的是各种安全威胁的出现。为了保障用户和企业的信息安全&#xff0c;软件安全测评变得至关重要。而漏洞扫描和代码审计作为安全测评中的重要过程&#xff0c;卓码测评小编…

【线性代数】SVDPCA

用最直观的方式告诉你&#xff1a;什么是主成分分析PCA_哔哩哔哩_bilibili 奇异值分解singular value decomposition&#xff0c;SVD principal component analysis,PCA 降维操作 pca就是降维后使得信息损失最小 投影在坐标轴上的点越分散&#xff0c;信息保留越多 pca的实现…

2-异常-FileNotFoundException(三种不同的报错)

2-异常-FileNotFoundException(三种不同的报错) 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&#xff09; 生活公众…

关于认证协议

本地用户认证 本地认证的意思就是&#xff0c;我们的电脑上存储着自己的账号密码&#xff0c;无论电脑是否联网&#xff0c;只要能开机&#xff0c;就可以输入账号密码登录到电脑中&#xff0c;工作组就是采用本地认证 本地认证流程 winlogon.exe -> 接收用户输入 -> …

【异常分析:四分位距与3σ原则】

文章目录 前言四分位距&#xff08;IQR&#xff09;3σ原则使用步骤计算四分位距应用3σ原则 代码 前言 异常分析的目标是识别数据中的异常值&#xff0c;这些异常值可能是由于错误的记录、设备故障或者其他未知原因导致的。四分位距&#xff08;interquartile range, IQR&…

H5进度条样式,自定义进度条

进度条样式预览 实现代码&#xff1a; <view class"mainPro"><view class"proBg"><view class"proDetail" :style"{ width: ${schedule}% }"></view></view><view class"proTxt">完成进…

【StableDiffusion】2024.6.4 亲测成功,无魔法 Civitai 镜像,国内下载 Civitai 模型的方法

一、废话不说&#xff0c;直接开始 废话&#xff1a;请注意&#xff0c;这个插件不是万能的&#xff0c;有一些模型无法下载&#xff0c;大概能下载 70% 左右的模型 1.github下载插件 https://github.com/tzwm/sd-webui-model-downloader-cn/tree/main 这个步骤不用我多说了…

Spring boot集成通义千问大模型实现智能问答

Spring boot集成通义千问大模型实现智能问答 背景 我在用idea进行java开发时发现了通义灵码这款免费的智能代码补全插件&#xff0c;用了一段时间了&#xff0c;感觉很不错。就想着在自己的项目中也能集成通义千问大模型实现智能回答&#xff0c;毕竟对接openai需要解决网络问…

SQL注入-时间盲注

SQL时间盲注&#xff08;Time-based Blind SQL Injection&#xff09;&#xff0c;又叫延时注入&#xff0c;是一种SQL注入攻击技术&#xff0c;用于在无法直接获取查询结果或查看响应内容变化的情况下&#xff0c;通过引入时间延迟来推断数据库的信息&#xff1b;时间盲注依赖…

什么是真正的高效阅读,高效阅读的方法和技巧

一、教程描述 查理芒格说他认识的厉害的人没有一个不读书的&#xff0c;为什么我们也读书却成不了厉害的那个人呢&#xff1f;所以这绝对不是书的问题&#xff0c;而是人的问题。阅读应该带有目的性&#xff0c;要帮我们解决实际问题。如果读一本书只是读完它&#xff0c;那读…

如何理解与学习数学分析——第一部分——数学分析概观

第1 部分&#xff1a;数学分析概观(Studying Analysis) 1. 数学分析之面目(What is Analysis like?) 本章说明了分析中的定义、定理和证明。 它介绍了一些符号&#xff0c;并解释了如何使用数学分析中的这些数学符号和数学词汇、以及应该把它们读成什么。它指出了这种类型的…