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 ...
随机推荐
- Golang 常见设计模式之装饰模式
想必只要是熟悉 Python 的同学对装饰模式一定不会陌生,这类 Python 从语法上原生支持的装饰器,大大提高了装饰模式在 Python 中的应用.尽管 Go 语言中装饰模式没有 Python 中 ...
- web服务器-nginx负载均衡
web服务器-nginx负载均衡 一 负载均衡的作用 负载均衡: 分摊到多个操作单元上进行执行,和它的英文名称很匹配.就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整 ...
- SQL注入之PHP+Mysql
PHP+Mysql(GET方法+数值型+有错误回显)的注入方法 目标系统:PHP+MYSQL(GET方法+数值型+有错误信息) 环境说明: 后台地址:http://ip/cms/admin/login ...
- 知识点简单总结——FWT(快速沃尔什变换),FST(快速子集变换)
知识点简单总结--FWT(快速沃尔什变换),FST(快速子集变换) 闲话 博客园的markdown也太傻逼了吧. 快速沃尔什变换 位运算卷积 形如 $ f[ i ] = \sum\limits_{ j ...
- 如何在vscode中编写.net core 项目(vscode)
1.下载拓展 .NET Core Extension Pack (作者:保哥) 这个里面将需要的插件都打包了小白一键下载就好了 2.下载扩展 vscode-solution-explorer ...
- 面试之Java String 编码相关
实话说,作为一个多年Java老年程序员,直到近来,在没有决心花时间搞清楚Java String的编码相关问题之前, 自己也都还是似懂非懂,一脸懵逼的.设想如果在面试中,有同学能够条理清晰的回答下面的问 ...
- 构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载.
- 服务注册和发现是什么意思?Spring Cloud 如何实现?
当我们开始一个项目时,我们通常在属性文件中进行所有的配置.随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂.有些服务可能会下降,而某些位置可能会发生变化.手动更改属性可能会产生问题.Eur ...
- 如何在网上找java包
如图所示 在java api后面输入你要找包的名称就可以了
- synchronized、volatile、CAS 比较?
1.synchronized 是悲观锁,属于抢占式,会引起其他线程阻塞. 2.volatile 提供多线程共享变量可见性和禁止指令重排序优化. 3.CAS 是基于冲突检测的乐观锁(非阻塞)