1. 程式人生 > 其它 >OpenHarmony 3.1 Beta版本關鍵特性解析——探祕隱式查詢

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