OpenHarmony 3.1 Beta版本关键特性解析——探秘隐式查询
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点)

徐浩
隐式查询是 OpenAtom OpenHarmony(以下简称“OpenHarmony”)的一个基础能力,被广泛应用于各种应用中(如视频播放、阅读器播放等)。应用通过隐式查询可以借助其他应用提供的能力,从而减少开发者工作量,同时给用户带来更好的体验。
那么隐式查询是什么?隐式查询是如何实现的?等等一连串疑问想必是开发者们最关心的问题,本期将对这些问题进行详细的解答。
一、什么是隐式查询?
当一个应用执行某操作时,如果应用自己不具备此操作需要的能力,则会触发系统的隐式查询功能。系统去查找其他具备此项能力的应用,并通过应用选择器展示给用户,让用户选择使用哪个应用来完成操作。
为了帮助大家理解,我们来举个例子:
在微信中打开 pdf 文件时, 如果没有设置默认的 pdf 文件阅读器,那么系统会通过隐式查询查找所有具备 pdf 阅读能力的应用,并通过应用选择器将其展示给用户进行选择。
二、隐式查询代码解析
从上面隐式查询的定义,我们了解到:
1. 查询方应用需要执行要执行的操作。
2. 其他应用需要声明自己具备的能力。
下面我们结合示例,看看具体的代码实现吧。
第一步:在查询方应用的 Ability 中通过 want 信息指定要执行的操作。
want 信息示例代码如下:
"want"{
"action":"action.system.play",
"entities":["entity.system.video", "entity.system.camera"],
"uri" :"https://www.test.com:8080/query/student/name",
"type":"text/plain"
}
当应用调用 startAbility 接口启动 Ability 时,通过 want 信息中的 action、entities、uri 和 type 属性指定要执行的操作。
第二步:在其他应用的配置文件 config.json 中通过 skills 参数声明具备的能力。
skills 信息示例代码如下:
"skills": [
{
"actions": ["action.system.play"],
"entities": ["entity.system.video", "entity.system.camera"],
"uris": [
{
"scheme": "https",
"host": "www.test.com",
"port": "8080",
"path": "query/student/name",
"pathStartWith":"query/student",
"pathRegex":"query/.*/name",
"type": "text/plain"
}
]
}
]
完成上面两步,系统就可以进行隐式查询了。系统按照隐式查询规则,将其他应用的 skills 信息与查询方应用的 want 信息进行匹配,然后将匹配成功的应用通过应用选择器展示给用户进行选择。
下面我们为大家详细讲解隐式查询的匹配规则。
三、隐式查询匹配规则详解
系统将其他应用的 skills 信息(包含 actions、entities 和 uris 属性)与查询方应用的 want 信息(包含 action、entities、uri 和 type 属性)进行匹配,具体匹配规则如下:
1. action 匹配规则
将其他应用 skills 信息中的 actions 与查询方应用 want 信息中的 action 进行匹配。
- 如果 skills 信息中的 actions 为空,匹配不通过。
- 如果 skills 信息中的 actions 不为空,且其包含 want 信息中的 action(可以为空),匹配通过。否则匹配不通过。
2. entities 匹配规则
将其他应用 skills 信息中的 entities 与查询方应用 want 信息中的 entities 进行匹配。
- 如果 skills 信息中的 entities 为空,则只有当 want 信息中的 entities 为空时才匹配通过。否则匹配不通过。
- 如果 skills 信息中的 entities 不为空,且其包含 want 信息中的 entities(可以为空),匹配通过。否则匹配不通过。
3. uri 匹配规则
将其他应用 skills 信息的 uris 中的 scheme、host、port、path、pathStartWith 和 pathRegex 属性拼接成uri(scheme://host:port/(path;pathStartWith;pathRegex)),将此 uri 与查询方应用 want 信息中的 uri 进行匹配。其中,path 为完整路径匹配,pathStartWith 为前缀匹配,pathRegx 为正则匹配。
skills 信息的 uris 中的 type 与 want 信息中的 type 进行匹配,支持*通配符匹配。
- 如果 skills 信息拼接的 uri 为空,则只有当 want 信息中的 uri 为空时才匹配通过。否则匹配不通过。
- 如果 skills 信息拼接的 uri 不为空,且其包含 want 信息中的 uri(不可以为空),uri 匹配通过。否则匹配不通过。
4. type 匹配规则
将其他应用 skills 信息的 uris 中的 type 与查询方应用 want 信息中的 type 进行匹配,支持*通配符匹配。
- 如果 skills 信息中的 type 为空,则只有当 want 信息中的 type 为空时才匹配通过。否则匹配不通过。
- 如果 skills 信息中的 type 不为空,且其包含 want 信息中的 type(不可以为空),匹配通过。否则匹配不通过。
当应用的以上四个属性都匹配通过,此应用才会被应用选择器展示给用户进行选择。
四、典型隐式查询匹配示例
为了让大家更好地理解,下面我们看看几个典型的匹配示例:
示例1:
查询方应用的 want 信息示例代码:
featureAbility.startAbility({
"want": {
"action": "action.system.play"
}, }).then((data) => {})
其他应用的 skills 信息示例代码:
"skills": [
{
"actions": ["action.system.play"]
}
]
- skills 信息中的 actions 不为空,且其包含 want 信息中的 action,action 匹配通过。
- skills 信息中的 entities 为空,want 信息中的 entities 也为空,entities 匹配通过。同理,uri 和 type 也匹配通过。
此示例,四个属性均匹配成功,则此应用匹配成功,会被应用选择器展示给用户进行选择。
示例2:
查询方应用的 want 信息示例代码:
featureAbility.startAbility({
"want": {
"type": "prefixType/suffixType",
}, }).then((data) => {})
其他应用的 skills 信息示例代码:
"skills": [
{
"actions": ["action.system.play"],
"uris": [
{
"type": "prefixType/suffixType"
}
]
}
]
- skills 信息中的 actions 不为空, want 信息中的 action 为空,action 匹配通过。
- skills 信息中的 entities 为空,want 信息中的 entities 也为空,entities 匹配通过。同理,uri 也匹配通过。
- skills 信息中的 type 不为空,且其包含 want 信息中的 type,type 匹配通过。
此示例,四个属性均匹配成功,则此应用匹配成功,会被应用选择器展示给用户进行选择。
示例3:
查询方应用的 want 信息示例代码:
featureAbility.startAbility({
"want": {
"type": "text/plain",
"uri": "https://www.test.com:8080/query/student"
}, }).then((data) => {})
其他应用的 skills 信息示例代码:
"skills": [
{
"actions": ["action.system.play"],
"uris": [
{
"scheme": "https",
"host": "www.test.com",
"port": "8080",
"path": "query/student",
"type": "text/*"
}
]
}
- skills 信息中的 actions 不为空, want 信息中的 action 为空,action 匹配通过。
- skills 信息中的 entities 为空,want 信息中的 entities 也为空,entities 匹配通过。
- skills 信息的 uris 中 scheme、host、port 和 path 属性拼接出 uri 为 https://www.test.com:8080/query/student,与 want 信息中的 uri 一致,uri 匹配通过。
- skills 信息中的 type 为 text/*(*表示通配),want 信息中的 type 为 text/plain,type 匹配通过。
此示例,四个属性均匹配成功,则此应用匹配成功,会被应用选择器展示给用户进行选择。
示例4:
查询方应用的 want 信息示例代码:
featureAbility.startAbility({
"want": {
"action": "action.system.play",
"entities":["entity.system.video"],
"type": "text/plain",
"uri": "https://www.test.com/query/student"
}, }).then((data) => {})
其他应用的 skills 信息示例代码:
"skills": [
{
"actions": ["action.system.play"],
"entities": ["entity.system.video"],
"uris": [
{
"scheme": "https",
"host": "www.test.com",
"pathStartWith": "query",
"type": "text/plain"
}
]
}
]
- skills 信息中的 actions 不为空, want 信息中的 action 为空,action 匹配通过。
- skills 信息中的 entities 为空,want 信息中的 entities 也为空,entities 匹配通过。
- skills 信息的 uris 中 scheme、host、port 和 path 属性拼接出 uri 为 https://www.test.com:8080/query/student,与 want 信息中的 uri 一致,uri 匹配通过。
- skills 信息中的 type 为 text/*(*表示通配),want 信息中的 type 为 text/plain,type 匹配通过。
此示例,四个属性均匹配成功,则此应用匹配成功,会被应用选择器展示给用户进行选择。
通过以上示例,相信大家已经清楚隐式查询匹配规则了。我们在全文介绍了隐式查询是什么,并对隐式查询的相关代码和匹配规则进行了深入剖析。
隐式查询,你都 get 到了吗?希望开发者们可以将隐式查询应用于更多的场景和领域中。

扫码添加开发者小助手微信
获取更多OpenHarmony开发资源和开发者活动资讯
OpenHarmony 3.1 Beta版本关键特性解析——探秘隐式查询的更多相关文章
- OpenHarmony 3.1 Beta版本关键特性解析——HiStreamer框架大揭秘
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 陈国栋 数字多媒体技术在过去的数十年里得到了飞速的发展,多媒体终端设备如智能音箱.智能门锁.智能手表广泛应用于人们 ...
- OpenHarmony 3.1 Beta版本关键特性解析——HAP包安装实现剖析
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 石磊 随着社会的不断发展,人们逐渐注重更加高效.舒适.便捷.有趣的生活和工作体验. OpenAtom OpenHa ...
- OpenHarmony 3.1 Beta 版本关键特性解析——ArkUI canvas组件
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 江英杰 华为技术有限公司 canvas 是 ArkUI 开发框架里的画布组件,常用于自定义绘制图形.因为其轻量.灵活. ...
- OpenHarmony 3.1 Beta版本关键特性解析——OpenHarmony图形框架
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 李煜 华为技术有限公司 崔坤华为技术有限公司 众所周知,动画是系统和应用与用户交互的重要环节.动画效果的好坏会直接影响 ...
- OpenHarmony 3.1 Beta版本关键特性解析——ArkUI容器类API介绍
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 刘鑫 容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法.在 ArkUI 开发框 ...
- OpenHarmony 3.1 Beta版本关键特性解析——分布式DeviceProfile
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 成翔 OpenAtom OpenHarmony(以下简称"OpenHarmony")作为分布式操作 ...
- OpenHarmony3.1 Release版本关键特性解析——Enhanced SWAP内存管理
樊成阳 华为技术有限公司内核专家 陈杰 华为技术有限公司内核专家 OpenAtom OpenHarmony(以下简称"OpenHarmony")是面向全场景泛终端设备的操作系统,终 ...
- Unity 5.6 beta版本新特性
http://manew.com/thread-98549-1-1.html 最新发布的beta版改进了编辑器和2D功能,图形性能更佳,加入新的视频播放器,并添加了对Facebook Gameroom ...
- C#10新特性-全局和隐式usings
.NET 6发布后支持C#10,C# 10 向 C# 语言添加了很多功能,今天我们分享一下全局和隐式usings的使用: using 指令简化了使用命名空间的方式. C# 10 包括一个新的全局 us ...
随机推荐
- Anaconda 01_安装问题
一. 创建环境 1.打开cmd 使用如下语句创建环境 conda create -n 环境名 2. 查看当前conda所有环境 conda info --envs 3.激活环境(其中一句) Co ...
- Linux下编译安装配置MariaDB数据库
说明:操作系统:CentOS 6.6 64位MariaDB版本:mariadb-5.5.33aMariaDB数据库存放目录:/data/mysql准备:一.配置防火墙,开启3306端口vi /etc ...
- 6月15日 python学习总结 Django模板语言相关内容
Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...
- MySQL SQL Injection Cheat Sheet
MySQL SQL Injection Cheat Sheet Some useful syntax reminders for SQL Injection into MySQL databases- ...
- 如何选择 Linux 操作系统版本?
一般来讲,桌面用户首选 Ubuntu :服务器首选 RHEL 或 CentOS ,两者中首选 CentOS .根据具体要求:· 安全性要求较高,则选择 Debian 或者 FreeBSD .· 需要使 ...
- React算法复杂度优化?
react树对比是按照层级去对比的, 他会给树编号0,1,2,3,4.... 然后相同的编号进行比较.所以复杂度是n,这个好理解. 关键是传统diff的复杂度是怎么算的?传统的diff需要出了上面的比 ...
- 数据库中的ACID
参考链接:什么是ACID 数据库中的锁机制
- springBoot集成Elasticsearch抛出Factory method 'restHighLevelClient' threw exception; nested exception is java.lang.NoSuchFieldError: IGNORE_DEPRECATIONS
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'restHighLeve ...
- MySQL 里记录货币用什么字段类型?
NUMERIC 和 DECIMAL 类型被 MySQL 实现为同样的类型,这在 SQL92 标准允 许.他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数 据.当声明一个类是这些类型之 ...
- 在虚拟机里面安装mysql
https://dev.mysql.com/downloads/repo/yum/ 首先到网站里面下载 mysql80-community-release-el7-3.noarch.rpm 通过xft ...