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開發資源和開發者活動資訊