鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:UIExtensionComponent (系统接口))

UIExtensionComponent用于支持在本页面内嵌入其他应用提供的UI。展示的内容在另外一个进程中运行,本应用并不参与其中的布局和渲染。

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

说明:

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

本模块为系统接口。

使用约束

本组件不支持预览。

被拉起的Ability必须是带UI的Ability扩展,如何实现带UI的Ability扩展请参考实现带UI的Ability扩展。

必须显示设置组件宽高为非0有效值。

子组件

接口

UIExtensionComponent(want: Want, options?: UIExtensionOptions)

参数:

参数名参数类型必填参数描述
wantWant要加载的Ability。
options11+UIExtensionOptions需要传递的构造项。

属性

支持通用属性。

事件

不支持通用事件。

将事件经过坐标转换后传递给对端Ability处理。

支持以下事件:

onRemoteReady

onRemoteReady(callback: Callback<UIExtensionProxy>)

UIExtensionAbility连接完成时的回调,之后可使用proxy向被拉起的Ability发送数据。

参数:

参数名类型说明
proxyUIExtensionProxy用于向对端Ability发送数据。

onReceive

onReceive(callback: Callback<{ [key: string]: Object }>)

收到被拉起的Ability发送的数据时触发的回调。

参数:

参数名类型说明
data{ [key: string]: Object }收到来自对端Ability的数据。

onResult

onResult(callback: Callback<{code: number; want?: Want}>)

被拉起的Ability扩展调用terminateSelfWithResult时会先触发本回调函数,再触发OnRelease。

本回调内可处理对端Ability的结果数据,可参考AbilityResult。

参数:

参数名类型说明
codenumber收到来自对端Ability的处理結果code。
wantWant收到来自对端Ability的处理結果Want。

onRelease

onRelease(callback: Callback<number>)

用于处理被拉起的Ability销毁时的回调。

被拉起的Ability扩展调用terminateSelfWithResult或者terminateSelf时会触发本回调,此时releaseCode为0,即正常销毁。

被拉起的Ability扩展意外Crash或被kill时,触发本回调,此时releaseCode为1。

参数:

参数名类型说明
releaseCodenumber对端Ability销毁时的code,0为正常销毁,1为异常销毁。

onError

onError(callback:ErrorCallback)

被拉起的Ability扩展在运行过程中发生异常时触发本回调。可通过回调参数中的code、name和message获取错误信息并做处理。

参数:

参数名类型说明
errBusinessError报错信息。

UIExtensionOptions11+

用于在UIExtensionComponent进行构造的时传递可选的构造参数。

参数:

参数名参数类型必填参数描述
isTransferringCallerboolean在使用UIExtensionComponent嵌套时,设置当前UIExtensionComponent是否转发上一级的Caller信息。 默认值:false。

UIExtensionProxy

用于在双方建立连接成功后,组件使用方向被拉起的Ability发送数据、订阅和取消订阅注册。

send

send(data: { [key: string]: Object }): void

用于在双方建立连接成功后,组件使用方向被拉起的Ability发送数据的场景,提供异步发送数据。

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

参数:

参数名参数类型必填参数描述
data{ [key: string]: Object }异步发送给被拉起的扩展Ability的数据。

sendSync11+

sendSync(data: { [key: string]: Object }): { [key: string]: Object }

用于在双方建立连接成功后,组件使用方向被拉起的Ability发送数据的场景,提供同步发送数据。

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

参数:

参数名参数类型必填参数描述
data{ [key: string]: Object }同步发送给被拉起的扩展Ability的数据。

返回值:

类型描述
{ [key: string]: Object }扩展Ability回复的数据。

错误码:

错误号描述
100011扩展Ability未注册同步回调
100012数据发送失败

on('asyncReceiverRegister')11+

on(type: 'asyncReceiverRegister', callback: (proxy: UIExtensionProxy) => void): void

用于在双方建立连接成功后,组件使用方订阅被拉起的Ability发生异步注册的场景。

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

参数:

参数名参数类型必填参数描述
typestring代表订阅扩展Ability发生异步注册回调。
callback(proxy: UIExtensionProxy) => void订阅扩展Ability注册setReceiveDataCallback后触发的回调。

on('syncReceiverRegister')11+

on(type: 'syncReceiverRegister', callback: (proxy: UIExtensionProxy) => void): void

用于在双方建立连接成功后,组件使用方订阅被拉起的Ability发生同步注册的场景。

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

参数:

参数名参数类型必填参数描述
typestring订阅扩展Ability发生同步注册回调。
callback(proxy: UIExtensionProxy) => void扩展Ability注册setReceiveDataForResultCallback后触发的回调。

off('asyncReceiverRegister')11+

off(type: 'asyncReceiverRegister', callback?: (proxy: UIExtensionProxy) => void): void

用于在双方建立连接成功后,组件使用方取消订阅被拉起的Ability发生异步注册的场景。

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

参数:

参数名参数类型必填参数描述
typestring取消订阅扩展Ability发生异步注册回调。
callback(proxy: UIExtensionProxy) => void为空代表取消订阅所有扩展Ability异步注册后触发回调。
非空代表取消订阅异步对应回调。

off('syncReceiverRegister')11+

off(type: 'syncReceiverRegister', callback?: (proxy: UIExtensionProxy) => void): void

用于在双方建立连接成功后,组件使用方取消订阅被拉起的Ability发生同步注册的场景。

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

参数:

参数名参数类型必填参数描述
typestring取消订阅扩展Ability发生同步注册回调。
callback(proxy: UIExtensionProxy) => void为空代表取消订阅所有扩展Ability同步注册后触发回调
非空代表取消订阅同步对应回调。

示例

本示例仅展示组件使用的方法和扩展的Ability,实际运行需在设备中安装bundleName为"com.example.uiextensionprovider",abilityName为"UIExtensionProvider"的Ability扩展。

// 组件使用示例:
@Entry
@Component
struct Second {@State message1: string = 'Hello World 1'@State message2: string = 'Hello World 2'@State message3: string = 'Hello World 3'@State visible: Visibility = Visibility.Hidden@State wid: number = 300@State hei: number = 300private proxy: UIExtensionProxy = undefinedbuild() {Row() {Column() {Text(this.message1).fontSize(30)Text(this.message2).fontSize(30)Text(this.message3).fontSize(30)UIExtensionComponent({bundleName : "com.example.newdemo",abilityName: "UIExtensionProvider",parameters: {"ability.want.params.uiExtensionType": "dialog"}}).width(this.wid).height(this.hei).border({width: 5, color: Color.Blue}).onResult((data)=>{this.message1 = JSON.stringify(data['want']['bundleName'])}).onRelease((code)=>{this.message2 = "release code : " + code}).onReceive((data) => {console.info('Lee onReceive, for test')this.message3 = JSON.stringify(data['data'])}).onRemoteReady((proxy) => {console.info('onRemoteReady, for test')this.proxy = proxythis.proxy.on("syncReceiverRegister", syncRegisterCallback1);// this.proxy.on("syncReceiverRegister", syncRegisterCallback2);// this.proxy.off("syncReceiverRegister");// this.proxy.off("syncReceiverRegister", (proxy) => {//   console.info("off invoke for test, type is syncReceiverRegister");// });this.proxy.on("asyncReceiverRegister", (proxy1) => {console.info("on invoke for test, type is asyncReceiverRegister");});//// this.proxy.off("asyncReceiverRegister");})Button("点击向UIExtensionAbility发送数据").onClick(() => {if (this.proxy != undefined) {this.proxy.send({data: "你好1"})try {let re = this.proxy.sendSync({data: "你好2"})console.info("for test, re=" + JSON.stringify(re));} catch (err) {console.error(`sendSync failed for test. errCode=${err.code}, msg=${err.message}`);}}})}.width('100%')}.height('100%')}
}function syncRegisterCallback1(proxy: UIExtensionProxy) {console.info("on invoke for test, syncRegisterCallback1, type is syncReceiverRegister");
}function syncRegisterCallback2(proxy: UIExtensionProxy) {console.info("on invoke for test, syncRegisterCallback2, type is syncReceiverRegister");
}
// 扩展入口文件UIExtensionProvider.ts
import UIExtensionAbility from '@ohos.app.ability.UIExtensionAbility'
import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession'
import Want from '@ohos.app.ability.Want';
const TAG: string = '[UIExtAbility]'
export default class UIExtAbility extends UIExtensionAbility {onCreate() {console.log(TAG, `UIExtAbility onCreate`)}onForeground() {console.log(TAG, `UIExtAbility onForeground`)}onBackground() {console.log(TAG, `UIExtAbility onBackground`)}onDestroy() {console.log(TAG, `UIExtAbility onDestroy`)}onSessionCreate(want: Want, session: UIExtensionContentSession) {console.log(TAG, `UIExtAbility onSessionCreate, want: ${JSON.stringify(want)}`)let param: Record<string, UIExtensionContentSession> = {'session': session};let storage: LocalStorage = new LocalStorage(param);session.loadContent('pages/extension', storage);}onSessionDestroy(session: UIExtensionContentSession) {console.log(TAG, `UIExtAbility onSessionDestroy`)}
}
// 扩展Ability入口页面文件extension.ets
import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession';
import router from '@ohos.router';let storage = LocalStorage.getShared()@Entry(storage)
@Component
struct Extension {@State message: string = 'UIExtensionAbility'private session: UIExtensionContentSession = storage.get<UIExtensionContentSession>('session');onPageShow() {if (this.session != undefined) {this.session.setReceiveDataCallback((data)=> {this.message = JSON.stringify(data['data'])console.info("invoke for test, handle callback set by setReceiveDataCallback successfully");})this.session.setReceiveDataForResultCallback(func1)}}build() {Row() {Column() {Text(this.message).fontSize(20).fontWeight(FontWeight.Bold)Button("点击向Component发送数据").onClick(()=>{if (this.session != undefined) {this.session.sendData({"data": 543321})console.info('send 543321, for test')}})Button("terminate").onClick(()=> {if (this.session != undefined) {this.session.terminateSelf();}storage.clear()})Button("terminate with result").onClick(()=>{if (this.session != undefined) {this.session.terminateSelfWithResult({resultCode: 0,want: {bundleName: "myBundleName",parameters: { "result": 123456 }}})}storage.clear()})Button("点击跳转").onClick(()=> {router.pushUrl({url: 'pages/hello'})})}}.height('100%')}
}
function func1(data: { [key: string]: Object; }): { [key: string]: Object; } {this.message = JSON.stringify(data['data'])console.info("invoke for test, handle callback set by setReceiveDataForResultCallback successfully");return data;
}

最后,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(HarmonyOS NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

QT C++ QButtonGroup应用

//QT 中&#xff0c;按钮数量比较少&#xff0c;可以分别用各按钮的信号和槽处理。 //当按钮数量较多时&#xff0c;用QButtonGroup可以实现共用一个槽函数&#xff0c;批量处理&#xff0c;减少垃圾代码&#xff0c; //减少出错。 //开发平台&#xff1a;win10QT6.2.4 MSVC…

Xilinx FPGA模式配置

Xilinx FPGA模式配置 Xilinx UltraScale FPGA有7种配置模式&#xff0c;由模式输入引脚M[2:0]决定。七种模式如图1所示。 图1 7种配置模式 7种模式可分为3大类&#xff0c; 1、JTAG模式&#xff08;可归为从模式&#xff09;&#xff1b; 2、主模式&#xff1b; 3、从模式…

基于SpringBoot SSM vue办公自动化系统

基于SpringBoot SSM vue办公自动化系统 系统功能 登录 个人中心 请假信息管理 考勤信息管理 出差信息管理 行政领导管理 代办事项管理 文档管理 公告信息管理 企业信息管理 会议室信息管理 资产设备管理 员工信息管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: S…

OpenCV4.9.0开源计算机视觉库在 Linux 中安装

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 环境变量参考 下一篇&#xff1a;将OpenCV与gcc和CMake结合使用 引言&#xff1a; OpenCV是一个开源的计算机视觉库&#xff0c;由英特尔公司所赞助。它是一个跨…

【LeetCode热题100】146. LRU 缓存(链表)

一.题目要求 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c…

wsl or 虚拟机 安装

1.wsl2安装 WSL全称Windows Subsystem for Linux&#xff0c;是微软开发的适用于Linux的Windows子系统 如今已经有两代了&#xff1a; 所以用的多的还是wsl2。 安装前需要先去设置启用或关闭Windows功能&#xff1a; 打开适用于linux的子系统和虚拟机平台。 Microsoft Store里…

matlab simulink 工业现场漆包机烘炉模糊PID控制算法

1、内容简介 略 70-可以交流、咨询、答疑 2、内容说明 matlab simulink 工业现场漆包机烘炉模糊PID控制算法 第五章 控制算法仿真与分析 在第二章系统分析结合工业现场漆包机烘炉数学模型详细分析模糊PID控制算法以及解耦控制算法的优缺点、实现原理&#xff0c;为本章算法…

Jmeter---分布式

分布式&#xff1a;多台机协作&#xff0c;以集群的方式完成测试任务&#xff0c;可以提高测试效率。 分布式架构&#xff1a;控制机&#xff08;分发任务&#xff09;与多台执行机&#xff08;执行任务&#xff09; 环境搭建&#xff1a; 不同的测试机上安装 Jmeter 配置基…

Acwing-基础算法课笔记之动态规划(线性DP)

Acwing-基础算法课笔记之动态规划&#xff08;线性DP&#xff09; 一、数字三角形1、概述2、闫氏dp分析法代码示例 二、最长上升子序列1、概述2、闫氏dp分析法3、过程模拟4、代码演示 三、最长上升子序列强化版1、概述2、代码示例 四、最长公共子序列&#xff08;LCS&#xff0…

FFmpeg查看所有支持的编码/解码器/封装/解封装/媒体格式/滤镜

查看所有支持的编码器与解码器 ffmpeg -codecs 只查看所有编码器: ffmpeg -encoders 只查看所有解码器: ffmpeg -decoders 只查看H264编码器: ffmpeg -h encoderh264 只查看H264解码器: ffmpeg -h decoderh264 查看所有支持的封装: ffmpeg -muxers 查看所有支持的解封装…

三.使用java的API文档

在Java中&#xff0c;API是指“应用程序接口”&#xff08;Application Programming Interface&#xff09;。Java API是Java编程语言中提供的类和接口的集合&#xff0c;用于开发各种类型的应用程序。类比C的STL&#xff08;标准模板库&#xff09;。 通俗理解就当做些封装好…

Spark-Scala语言实战(1)

在之前的文章中&#xff0c;我们学习了如何在Linux安装Spark以及Scala&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark及Scala的安装https:/…

如何在Windows11上安装WSL和Linux子系统以及搭建Docker环境

今天给大家介绍一下如何在Windows11上安装Docker 打开控制面板&#xff1a; 打开程序&#xff1a; 打开启用或关闭Windows功能。 勾选Linux子系统&#xff1a; 此时&#xff0c;可能需要重启电脑。 以管理员身份打开PowerShell执行&#xff1a; bcdedit /set hyperv…

C语言学习过程总结(18)——指针(6)

一、数组指针变量 在上一节中我们提到了&#xff0c;指针数组的存放指针的数组&#xff0c;那数组指针变量是什么呢&#xff1f; 显而易见&#xff0c;数组指针变量是指针 同样类比整型指针变量和字符指针变量里面分别存放的是整型变量地址和字符变量地址&#xff0c;我们可以…

layui table列表重载后保持进度条位置不变

使用layui的table表格组件时&#xff0c;当我们操作了某行的修改后&#xff0c;刷新了页面&#xff0c;进度条则跳回到最上面。 除了layui高版本应该内置有方法解决了此问题&#xff0c;但是低版本需要另外想办法解决。 具体解决方式如下&#xff1a; 1.在编辑操作成功前&am…

redis中List和hash数据类型

list类型是用来存储多个有序的字符串的&#xff0c;列表当中的每一个字符看做一个元素&#xff0c;一个列表当中可以存储一个或者多个元素&#xff0c;redis的list支持存储2^32-1个元素。redis可以从列表的两端进行插入&#xff08;pubsh&#xff09;和弹出&#xff08;pop&…

springboot多模块下swaggar界面出现异常(Knife4j文档请求异常)或者界面不报错但是没有显示任何信息

继上一篇博文&#xff0c;我们解决了多模块下扫描不到子模块的原因,建议先看上一个博客了解项目结构&#xff1a; springboot 多模块启动报错Field XXX required a bean of type XXX that could not be found. 接下来我们来解决swaggar异常的原因&#xff0c;我们成功启动项目…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:SideBarContainer)

提供侧边栏可以显示和隐藏的侧边栏容器&#xff0c;通过子组件定义侧边栏和内容区&#xff0c;第一个子组件表示侧边栏&#xff0c;第二个子组件表示内容区。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起…

Vue2在一个页面内动态切换菜单显示对应的路由组件

项目的需求是在一个页面内动态获取导航菜单&#xff0c;导航菜单切换的时候显示对应的路由页面&#xff0c;类似于tab切换的形式&#xff0c;切换的导航菜单和页面左侧导航菜单是同一个路由组件&#xff0c;只是放到了一个页面上&#xff0c;显示的个数不同&#xff0c;所有是动…

【C语言初阶(五)】数组

❣博主主页: 33的博客❣ ▶文章专栏分类: C语言从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; 目录 1. 前言2.一维数组的概念3.一维数组的创建和初始化3.1数组的创建3.2数组的初始化3.3数组的类型 4.一维数组的使用4.1数组下标4.2数组元素打印4.4数组元…