​(以下内容来自开发者分享,不代表 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版本关键特性解析——探秘隐式查询的更多相关文章

  1. OpenHarmony 3.1 Beta版本关键特性解析——HiStreamer框架大揭秘

    ​(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点)​ 陈国栋 数字多媒体技术在过去的数十年里得到了飞速的发展,多媒体终端设备如智能音箱.智能门锁.智能手表广泛应用于人们 ...

  2. OpenHarmony 3.1 Beta版本关键特性解析——HAP包安装实现剖析

    ​(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点)​ 石磊 随着社会的不断发展,人们逐渐注重更加高效.舒适.便捷.有趣的生活和工作体验. OpenAtom OpenHa ...

  3. OpenHarmony 3.1 Beta 版本关键特性解析——ArkUI canvas组件

    (以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 江英杰 华为技术有限公司 canvas 是 ArkUI 开发框架里的画布组件,常用于自定义绘制图形.因为其轻量.灵活. ...

  4. OpenHarmony 3.1 Beta版本关键特性解析——OpenHarmony图形框架

    (以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 李煜 华为技术有限公司 崔坤华为技术有限公司 众所周知,动画是系统和应用与用户交互的重要环节.动画效果的好坏会直接影响 ...

  5. OpenHarmony 3.1 Beta版本关键特性解析——ArkUI容器类API介绍

    (以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 刘鑫 容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法.在 ArkUI 开发框 ...

  6. OpenHarmony 3.1 Beta版本关键特性解析——分布式DeviceProfile

    (以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 成翔 OpenAtom OpenHarmony(以下简称"OpenHarmony")作为分布式操作 ...

  7. OpenHarmony3.1 Release版本关键特性解析——Enhanced SWAP内存管理

    樊成阳 华为技术有限公司内核专家 陈杰 华为技术有限公司内核专家 OpenAtom OpenHarmony(以下简称"OpenHarmony")是面向全场景泛终端设备的操作系统,终 ...

  8. Unity 5.6 beta版本新特性

    http://manew.com/thread-98549-1-1.html 最新发布的beta版改进了编辑器和2D功能,图形性能更佳,加入新的视频播放器,并添加了对Facebook Gameroom ...

  9. C#10新特性-全局和隐式usings

    .NET 6发布后支持C#10,C# 10 向 C# 语言添加了很多功能,今天我们分享一下全局和隐式usings的使用: using 指令简化了使用命名空间的方式. C# 10 包括一个新的全局 us ...

随机推荐

  1. Three.js 火焰效果实现艾尔登法环动态logo 🔥

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 <艾尔登法环>是最近比较火的一款游戏,观察可以发现它的 Log ...

  2. OAuth2和JWT - 如何设计安全的API?

    JWT和OAuth2比较? 要比较JWT和OAuth2?首先要明白一点就是,这两个根本没有可比性,是两个完全不同的东西. JWT是一种认证协议        JWT提供了一种用于发布接入令牌(Acce ...

  3. RabbitMQ Go客户端教程6——RPC

    本文翻译自RabbitMQ官网的Go语言客户端系列教程,本文首发于我的个人博客:liwenzhou.com,教程共分为六篇,本文是第六篇--RPC. 这些教程涵盖了使用RabbitMQ创建消息传递应用 ...

  4. Cobalt Strike之LINK木马

    在同一目录下 新建一个exp.ps1 一个test.txt exp.ps1代码 $file = Get-Content "test.txt" $WshShell = New-Obj ...

  5. session 会话机制以及变量覆盖

    session会话机制介绍如下 http是无状态协议.服务器靠cookie和session来记住用户.$_SESSION 和 $_GET等一样,是超全局变量. 后台脚本里面会写: session() ...

  6. Oracle数据常用的备份与恢复?

    Oracle的备份与恢复有三种标准的模式,大致分为两大类,备份恢复(物理上的)以及导入导出(逻辑上的),而备份恢复又可以根据数据库的工作模式分为非归档模式(Nonarchivelog-style)和归 ...

  7. jvm-learning-双亲委派机制

    是什么 工作原理  例子 优势 什么是沙箱安全机制 其他知识 对类加载器的引用 类的主动使用和被动使用

  8. 请说出作用域public,private,protected,以及不写时的区别?

    这四个作用域的可见范围如下表所示.说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly.作用域    当前类  同一package  子孙类   其他packagepublic    ...

  9. ssl免密登录(centos6)

    1.首先执行ll -a查看是否有隐藏文件.ssh,如果没有,需要执行ssh localhost登录以下即可 cd ~/.ssh 2.生成秘钥: 可查看https://hadoop.apache.org ...

  10. Java 中 LinkedHashMap 和 PriorityQueue 的区别是 什么?

    PriorityQueue 保证最高或者最低优先级的的元素总是在队列头部,但是 LinkedHashMap 维持的顺序是元素插入的顺序.当遍历一个 PriorityQueue 时,没有任何顺序保证,但 ...