HarmonyOS4.0系统性深入开发15Want概述

Want概述

Want的定义与用途

Want是对象间信息传递的载体,可以用于应用组件间的信息传递。其使用场景之一是作为startAbility()的参数,包含了指定的启动目标以及启动时需携带的相关数据,如bundleName和abilityName字段分别指明目标Ability所在应用的包名以及对应包内的Ability名称。当UIAbilityA启动UIAbilityB并需要传入一些数据给UIAbilityB时,Want可以作为一个载体将数据传给UIAbilityB。

图1 Want用法示意

img

Want的类型

  • 显式Want:在启动Ability时指定了abilityName和bundleName的Want称为显式Want。

    当有明确处理请求的对象时,通过提供目标Ability所在应用的包名信息(bundleName),并在Want内指定abilityName便可启动目标Ability。显式Want通常用于在当前应用开发中启动某个已知的Ability。参数说明参见Want参数说明

    let wantInfo = {    deviceId: '',// deviceId为空表示本设备    bundleName: 'com.example.myapplication',abilityName: 'FuncAbility',}
    
  • 隐式Want:在启动UIAbility时未指定abilityName的Want称为隐式Want。

    当请求处理的对象不明确时,希望在当前应用中使用其他应用提供的某个能力(通过skills标签定义),而不关心提供该能力的具体应用,可以使用隐式Want。例如使用隐式Want描述需要打开一个链接的请求,而不关心通过具体哪个应用打开,系统将匹配声明支持该请求的所有应用。

    let wantInfo = {    // uncomment line below if wish to implicitly query only in the specific bundle.    // bundleName: 'com.example.myapplication',action: 'ohos.want.action.search',// entities can be omitted    entities: [ 'entity.system.browsable' ],uri: 'https://www.test.com:8080/query/student',type: 'text/plain',};
    

    说明

    • 根据系统中待匹配Ability的匹配情况不同,使用隐式Want启动Ability时会出现以下三种情况。
      • 未匹配到满足条件的Ability:启动失败。
      • 匹配到一个满足条件的Ability:直接启动该Ability。
      • 匹配到多个满足条件的Ability(UIAbility):弹出选择框让用户选择。
    • 调用方传入的want参数中不带有abilityName和bundleName,则不允许通过隐式Want启动所有应用的ServiceExtensionAbility。
    • 调用方传入的want参数中带有bundleName,则允许使用startServiceExtensionAbility()方法隐式Want启动ServiceExtensionAbility,默认返回优先级最高的ServiceExtensionAbility,如果优先级相同,返回第一个。

Want参数说明

名称 读写属性 类型 必填 描述
deviceId 只读 string 表示目标Ability所在设备ID。如果未设置该字段,则表明本设备。
bundleName 只读 string 表示目标Ability所在应用名称。
moduleName 只读 string 表示目标Ability所属的模块名称。
abilityName 只读 string 表示目标Ability名称。如果未设置该字段,则该Want为隐式。如果在Want中同时指定了bundleName,moduleName和abilityName,则Want可以直接匹配到指定的Ability。
uri 只读 string 表示携带的数据,一般配合type使用,指明待处理的数据类型。如果在Want中指定了uri,则Want将匹配指定的Uri信息,包括scheme,schemeSpecificPart,authority和path信息。
type 只读 string 表示携带数据类型,使用MIME类型规范。例如:“text/plain”、"image/*"等。
action 只读 string 表示要执行的通用操作(如:查看、分享、应用详情)。在隐式Want中,您可定义该字段,配合uri或parameters来表示对数据要执行的操作。如打开,查看该uri数据。例如,当uri为一段网址,action为ohos.want.action.viewData则表示匹配可查看该网址的Ability。
entities 只读 Array 表示目标Ability额外的类别信息(如:浏览器,视频播放器),在隐式Want中是对action的补充。在隐式Want中,您可定义该字段,来过滤匹配UIAbility类别,如必须是浏览器。例如,在action字段的举例中,可存在多个应用声明了支持查看网址的操作,其中有应用为普通社交应用,有的为浏览器应用,您可通过entity.system.browsable过滤掉非浏览器的其他应用。
flags 只读 number 表示处理Want的方式。例如通过wantConstant.Flags.FLAG_ABILITY_CONTINUATION表示是否以设备间迁移方式启动Ability。
parameters 只读 {[key: string]: any} 此参数用于传递自定义数据,通过用户自定义的键值对进行数据填充,具体支持的数据类型如Want API所示。

显式Want与隐式Want匹配规则

在启动目标Ability时,会通过显式Want和隐式Want进行目标Ability的匹配,这里说的匹配规则就是调用方Want中设置的参数如何与目标Ability声明的配置文件进行匹配。

  • 显式Want匹配原理

    名称 类型 匹配项 必选 规则
    deviceId string 留空将仅匹配本设备内Ability。
    bundleName string 如果指定abilityName,而不指定bundleName,则匹配失败。
    moduleName string 留空时当同一个应用内存在多个模块且模块间存在重名Ability,将默认匹配第一个。
    abilityName string 该字段必须设置表示显式匹配。
    uri string 系统匹配时将忽略该参数,但仍可作为参数传递给目标Ability。
    type string 系统匹配时将忽略该参数,但仍可作为参数传递给目标Ability。
    action string 系统匹配时将忽略该参数,但仍可作为参数传递给目标Ability。
    entities Array 系统匹配时将忽略该参数,但仍可作为参数传递给目标Ability。
    flags number 不参与匹配,直接传递给系统处理,一般用来设置运行态信息,例如URI数据授权等。
    parameters {[key: string]: any} 不参与匹配,应用自定义数据将直接传递给目标Ability。
  • 隐式Want匹配原理

    名称 类型 匹配项 必选 规则
    deviceId string 跨设备目前不支持隐式调用。说明当前版本暂不支持跨设备能力。
    abilityName string 该字段必须留空表示隐式匹配。
    bundleName string - 声明bundleName时,隐式搜索将仅限于对应应用包内。- 声明bundleName与moduleName时,隐式搜索将仅限于对应应用的对应Module内。- 单独声明moduleName时,该字段无效。- 同时声明bundleName与moduleName时,隐式搜索将仅限于对应应用包内的对应模块内。这些字段将用来隐式匹配,具体规则可参考隐式Want匹配原理详解
    moduleName string -
    uri string -
    type string -
    action string -
    entities Array -
    flags number 不参与匹配,直接传递给系统处理,一般用来设置运行态信息,例如URI数据授权等。
    parameters {[key: string]: any} 不参与匹配,应用自定义数据将直接传递给目标Ability。

隐式Want匹配原理详解

从隐式Want的定义,可得知:

  • 调用方传入的want参数,表明调用方需要执行的操作,并提供相关数据以及其他应用类型限制。
  • 待匹配Ability的skills配置,声明其具备的能力(module.json5配置文件中的skills标签参数)。

系统将调用方传入的want参数(包含action、entities、uri和type属性)与已安装待匹配的应用Ability的skills配置(包含actions、entities、uris和type属性)依次进行匹配。当四个属性匹配均通过,则此应用才会被应用选择器展示给用户进行选择。

want参数的action匹配规则

将调用方传入的want参数的action与待匹配Ability的skills配置中的actions进行匹配。

  • 调用方传入的want参数的action为空,待匹配Ability的skills配置中的actions为空,则action匹配失败。

  • 调用方传入的want参数的action不为空,待匹配Ability的skills配置中的actions为空,则action匹配失败。

  • 调用方传入的want参数的action为空,待匹配Ability的skills配置中的actions不为空,则action匹配成功。

  • 调用方传入的want参数的action不为空,待匹配Ability的skills配置中的actions不为空且包含调用方传入的want参数的action,则action匹配成功。

  • 调用方传入的want参数的action不为空,待匹配Ability的skills配置中的actions不为空且不包含调用方传入的want参数的action,则action匹配失败。

    图1 want参数的action匹配规则

    点击放大

want参数的entities匹配规则

将调用方传入的want参数的entities与待匹配Ability的skills配置中的entities进行匹配。

  • 调用方传入的want参数的entities为空,待匹配Ability的skills配置中的entities不为空,则entities匹配成功。

  • 调用方传入的want参数的entities为空,待匹配Ability的skills配置中的entities为空,则entities匹配成功。

  • 调用方传入的want参数的entities不为空,待匹配Ability的skills配置中的entities为空,则entities匹配失败。

  • 调用方传入的want参数的entities不为空,待匹配Ability的skills配置中的entities不为空且包含调用方传入的want参数的entities,则entities匹配成功。

  • 调用方传入的want参数的entities不为空,待匹配Ability的skills配置中的entities不为空且不完全包含调用方传入的want参数的entities,则entities匹配失败。

    图2 want参数的entities匹配规则

    img

want参数的uri和type匹配规则

调用方传入的want参数中设置uri和type参数发起组件启动请求,系统会遍历当前系统已安装的组件列表,并逐个匹配待匹配Ability的skills配置中的uris数组,如果待匹配Ability的skills配置中的uris数组中只要有一个可以匹配调用方传入的want参数中设置的uri和type即为匹配成功。

图3 want参数中uri和type皆不为空时的匹配规则

img

实际应用中,uri和type共存在四种情况,下面将讲解四种情况的具体匹配规则:

  • 调用方传入的want参数的uri和type都为空。
    1. 如果待匹配Ability的skills配置中的uris数组为空,匹配成功。
    2. 如果待匹配Ability的skills配置中的uris数组中存在uri的scheme和type都为空的元素,匹配成功。
    3. 除以上两种情况,其他情况均为匹配失败。
  • 调用方传入的want参数的uri不为空,type为空。
    1. 如果待匹配Ability的skills配置中的uris数组为空,匹配失败。
    2. 如果待匹配Ability的skills配置中的uris数组存在一条数据uri匹配成功且type为空,则匹配成功,否则匹配失败。
  • 调用方传入的want参数的uri为空,type不为空。
    1. 如果待匹配Ability的skills配置中的uris数组为空,匹配失败。
    2. 如果待匹配Ability的skills配置中的uris数组存在一条数据uri的scheme为空且type匹配成功,则匹配成功,否则匹配失败。
  • 调用方传入的want参数的uri和type都不为空,如图3所示。
    1. 如果待匹配Ability的skills配置中的uris数组为空,匹配失败。
    2. 如果待匹配Ability的skills配置中的uris数组存在一条数据uri匹配type匹配需要均匹配成功,则匹配成功,否则匹配失败。

下图为了简化描述,称want中传入的uri为w_uri,称want中传入的type为w_type,待匹配Ability的skills配置中uris为s_uris,其中每个元素为s_uri;按自上而下顺序匹配。

图4 want参数中uri和type的具体匹配规则

img

uri匹配规则

这里为了简化描述,称want中传入的uri为w_uri,待匹配Ability的skills配置中uri为s_uri,具体的匹配规则如下:

  • 如果s_uri的scheme为空,当w_uri为空时匹配成功,否则匹配失败;
  • 如果s_uri的host为空,当w_uri和s_uri的scheme相同时匹配成功,否则匹配失败;
  • 如果s_uri的path、pathStartWith和pathRegex都为空,当w_uri和s_uri完全相同时匹配成功,否则匹配失败;
  • 如果s_uri的path不为空,当w_uri和s_uri全路径表达式相同时匹配成功,否则继续进行pathStartWith的匹配;
  • 如果s_uri的pathStartWith不为空,当w_uri包含s_uri前缀表达式时匹配成功,否则继续进行pathRegex的匹配;
  • 如果s_uri的pathRegex不为空,当w_uri满足s_uri正则表达式时匹配成功,否则匹配失败;

说明

待匹配Ability的skills配置的uris中scheme、host、port、path、pathStartWith和pathRegex属性拼接,如果依次声明了path、pathStartWith和pathRegex属性时,uris将分别拼接为如下三种表达式:

  • 全路径表达式:scheme://host:port/path
  • 前缀表达式:scheme://host:port/pathStartWith
  • 正则表达式:scheme://host:port/pathRegex

type匹配规则

说明

此小节所述的type匹配规则的适用性需建立在want参数内type不为空的基础上。当want参数内type为空时请参考want参数的uri和type匹配规则

这里为了简化描述,称want中传入的uri为w_type,待匹配Ability的skills数组中uris的type数据为s_type,具体的匹配规则如下:

  • 如果s_type为空,则匹配失败。
  • 如果s_type或者w_type为通配符"/",则匹配成功。
  • 如果s_type最后一个字符为通配符’',如"prefixType/",则当w_type包含"prefixType/"时匹配成功,否则匹配失败。
  • 如果w_type最后一个字符为通配符’',如"prefixType/",则当s_type包含"prefixType/"时匹配成功,否则匹配失败。

原文地址:https://blog.csdn.net/qq_46189388/article/details/135409134

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读1.4k次。被@Observed装饰的类,可以被观察到属性的变化;子组件中@ObjectLink装饰器装饰的状态变量用于接收@Observed装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是数组中的被@Observed装饰的项,或者是class object中是属性,这个属性同样也需要被@Observed装饰。单独使用@Observed是没有任何作用的,需要搭配@ObjectLink或者@Prop使用。_鸿蒙ark对象数组
文章浏览阅读1k次。Harmony OS_harmonyos创建数据库
文章浏览阅读1.1k次,点赞25次,收藏23次。自定义组件Header.ets页面(子组件)//自定义组件@Component//组件声明private title:ResourceStr//接收的参数build(){Row() {index.ets(父组件)//导入自定义组件@Entry@Componentbuild() {Column() {/*** 1. 自定义组件调用-----自定义组件------* 2. 在调用的组件上设置样式*/ShopTitle({ title: '商品列表' })
文章浏览阅读952次,点赞11次,收藏25次。ArkUI是一套构建分布式应用界面的声明式UI开发框架。它使用极简的UI信息语法、丰富的UI组件、以及实时界面预览工具,帮助您提升移动应用界面开发效率30%。您只需使用一套ArkTS API,就能在Android、iOS、鸿蒙多个平台上提供生动而流畅的用户界面体验。_支持ios 安卓 鸿蒙next的跨平台方案
文章浏览阅读735次。​错误: 找不到符号符号: 变量 Layout_list_item位置: 类 ResourceTable_错误: 找不到符号 符号: 变量 resourcetable 位置: 类 mainabilityslice
文章浏览阅读941次,点赞23次,收藏21次。harmony ARKTS base64 加解密_鸿蒙 鸿蒙加解密算法库
文章浏览阅读860次,点赞21次,收藏24次。使用自定义布局,实现子组件自动换行功能。图1自定义布局的使用效果创建自定义布局的类,并继承ComponentContainer,添加构造方法。//如需支持xml创建自定义布局,必须添加该构造方法实现ComponentContainer.EstimateSizeListener接口,在onEstimateSize方法中进行测量。......@Override//通知子组件进行测量//关联子组件的索引与其布局数据idx++) {//测量自身。_鸿蒙javaui
文章浏览阅读917次,点赞25次,收藏25次。这里需要注意的是,真机需要使用华为侧提供的测试机,测试机中会安装纯鸿蒙的系统镜像,能够体验到完整的鸿蒙系统功能,纯鸿蒙应用目前还不能完美地在 HarmonyOS 4.0 的商用机侧跑起来。当前,真机调试需要使用华为侧提供的测试机,测试机中会安装纯鸿蒙的系统镜像,能够体验到完整的鸿蒙系统功能,纯鸿蒙应用目前还不能完美地在 HarmonyOS 4.0 的商用机侧跑起来。另外,由于样式的解析是基于组件文件的纬度的,因此样式文件只能应用于被其引用的组件文件中,而不能跨文件应用,并且样式文件也只支持类选择器。_鸿蒙 小程序
文章浏览阅读876次,点赞17次,收藏4次。2. HarmonyOS应用开发DevEcoStudio准备-1HUAWEI DevEco Studio为运行在HarmonyOS和OpenHarmony系统上的应用和服务(以下简称应用/服务)提供一站式的开发平台。
文章浏览阅读811次。此对象主要映射JSON数组数据,比如服务器传的数据是这样的。_arkts json
文章浏览阅读429次。鸿蒙小游戏-数字华容道_华为鸿蒙手机自带小游戏
文章浏览阅读1.1k次,点赞24次,收藏19次。Ability是应用/服务所具备的能力的抽象,一个Module可以包含一个或多个Ability。
文章浏览阅读846次。本文带大家使用MQTT协议连接华为IoT平台,使用的是E53_IA1 智慧农业扩展板与 BearPi-HM_Nano 开发主板_mqtt 如何对接第三方iot平台
文章浏览阅读567次。HarmonyOS_arkts卡片
文章浏览阅读1k次,点赞19次,收藏20次。ArkTS开发鸿蒙OS连接mongoDB(后端node.js)2024最新教程
文章浏览阅读1.2k次,点赞23次,收藏15次。HarmonyOS与OpenHarmony(1)本质上的不同是:HarmonyOS是鸿蒙操作系统,而OpenHarmony则是从开源项目。这里可以联想一下Android,比如小米手机在Android开源系统的基础上开发了MIUI的手机操作系统,HarmonyOS就类似于MIUI,OpenHarmony类似Android基础底座。(2)HarmonyOS:是双框架,内聚了AOSP(Android Open Source Project )和OpenHarmony等。_鸿蒙模拟器开了怎么跑代码
文章浏览阅读1.1k次,点赞21次,收藏21次。鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Navigation组件。
文章浏览阅读2k次。由于之前的哥们匆忙离职了,所以鸿蒙手表项目的新版本我临时接过来打包发布,基本上之前没有啥鸿蒙经验,但是一直是做Android开发的,在工作人员的指导下发现打包配置基本上和Android一样,所以这些都不是问题,这里记录一下使用过程中遇到的问题。!过程和遇到的问题基本上都讲解了,关机睡觉,打卡收工。_鸿蒙系统adb命令
文章浏览阅读7.3k次,点赞9次,收藏29次。39. 【多选题】_column和row容器中,设置子组件在主轴方向上的对齐格式
文章浏览阅读1.1k次,点赞13次,收藏24次。18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器点击button按钮显示月份与获取的时间。_harmonyos农历获取