W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
在啟動目標(biāo)Ability時,會通過顯式Want和隱式Want進(jìn)行目標(biāo)Ability的匹配,這里說的匹配規(guī)則就是調(diào)用方Want中設(shè)置的參數(shù)如何與目標(biāo)Ability聲明的配置文件進(jìn)行匹配。
顯式Want匹配原理
名稱 | 類型 | 匹配項 | 必選 | 規(guī)則 |
---|---|---|---|---|
deviceId | string | 是 | 否 | 留空將僅匹配本設(shè)備內(nèi)Ability。 |
bundleName | string | 是 | 是 | 如果指定abilityName,而不指定bundleName,則匹配失敗。 |
moduleName | string | 是 | 否 | 留空時當(dāng)同一個應(yīng)用內(nèi)存在多個模塊且模塊間存在重名Ability,將默認(rèn)匹配第一個。 |
abilityName | string | 是 | 是 | 該字段必須設(shè)置表示顯式匹配。 |
uri | string | 否 | 否 | 系統(tǒng)匹配時將忽略該參數(shù),但仍可作為參數(shù)傳遞給目標(biāo)Ability。 |
type | string | 否 | 否 | 系統(tǒng)匹配時將忽略該參數(shù),但仍可作為參數(shù)傳遞給目標(biāo)Ability。 |
action | string | 否 | 否 | 系統(tǒng)匹配時將忽略該參數(shù),但仍可作為參數(shù)傳遞給目標(biāo)Ability。 |
entities | Array<string> | 否 | 否 | 系統(tǒng)匹配時將忽略該參數(shù),但仍可作為參數(shù)傳遞給目標(biāo)Ability。 |
flags | number | 否 | 否 | 不參與匹配,直接傳遞給系統(tǒng)處理,一般用來設(shè)置運(yùn)行態(tài)信息,例如URI數(shù)據(jù)授權(quán)等。 |
parameters | {[key: string]: any} | 否 | 否 | 不參與匹配,應(yīng)用自定義數(shù)據(jù)將直接傳遞給目標(biāo)Ability。 |
隱式Want匹配原理
名稱 | 類型 | 匹配項 | 必選 | 規(guī)則 |
---|---|---|---|---|
deviceId | string | 是 | 否 | 跨設(shè)備目前不支持隱式調(diào)用。 說明 當(dāng)前版本暫不支持跨設(shè)備能力。 |
abilityName | string | 否 | 否 | 該字段必須留空表示隱式匹配。 |
bundleName | string | 是 | 否 | - 聲明bundleName時,隱式搜索將僅限于對應(yīng)應(yīng)用包內(nèi)。 - 聲明bundleName與moduleName時,隱式搜索將僅限于對應(yīng)應(yīng)用的對應(yīng)Module內(nèi)。 - 單獨(dú)聲明moduleName時,該字段無效。 - 同時聲明bundleName與moduleName時,隱式搜索將僅限于對應(yīng)應(yīng)用包內(nèi)的對應(yīng)模塊內(nèi)。 這些字段將用來隱式匹配,具體規(guī)則可參考隱式Want匹配原理詳解。 |
moduleName | string | 是 | 否 | - |
uri | string | 是 | 否 | - |
type | string | 是 | 否 | - |
action | string | 是 | 否 | - |
entities | Array<string> | 是 | 否 | - |
flags | number | 否 | 否 | 不參與匹配,直接傳遞給系統(tǒng)處理,一般用來設(shè)置運(yùn)行態(tài)信息,例如URI數(shù)據(jù)授權(quán)等。 |
parameters | {[key: string]: any} | 否 | 否 | 不參與匹配,應(yīng)用自定義數(shù)據(jù)將直接傳遞給目標(biāo)Ability。 |
從隱式Want的定義,可得知:
調(diào)用方傳入的want參數(shù),表明調(diào)用方需要執(zhí)行的操作,并提供相關(guān)數(shù)據(jù)以及其他應(yīng)用類型限制。
待匹配Ability的skills配置,聲明其具備的能力(module.json5配置文件中的skills標(biāo)簽參數(shù))。
系統(tǒng)將調(diào)用方傳入的want參數(shù)(包含action、entities、uri和type屬性)與已安裝待匹配的應(yīng)用Ability的skills配置(包含actions、entities、uris和type屬性)依次進(jìn)行匹配。當(dāng)四個屬性匹配均通過,則此應(yīng)用才會被應(yīng)用選擇器展示給用戶進(jìn)行選擇。
將調(diào)用方傳入的want參數(shù)的action與待匹配Ability的skills配置中的actions進(jìn)行匹配。
調(diào)用方傳入的want參數(shù)的action不為空,待匹配Ability的skills配置中的actions為空,則action匹配失敗。
調(diào)用方傳入的want參數(shù)的action為空,待匹配Ability的skills配置中的actions不為空,則action匹配成功。
調(diào)用方傳入的want參數(shù)的action不為空,待匹配Ability的skills配置中的actions不為空且包含調(diào)用方傳入的want參數(shù)的action,則action匹配成功。
調(diào)用方傳入的want參數(shù)的action不為空,待匹配Ability的skills配置中的actions不為空且不包含調(diào)用方傳入的want參數(shù)的action,則action匹配失敗。
圖1 want參數(shù)的action匹配規(guī)則
將調(diào)用方傳入的want參數(shù)的entities與待匹配Ability的skills配置中的entities進(jìn)行匹配。
調(diào)用方傳入的want參數(shù)的entities為空,待匹配Ability的skills配置中的entities不為空,則entities匹配成功。
調(diào)用方傳入的want參數(shù)的entities為空,待匹配Ability的skills配置中的entities為空,則entities匹配成功。
調(diào)用方傳入的want參數(shù)的entities不為空,待匹配Ability的skills配置中的entities為空,則entities匹配失敗。
調(diào)用方傳入的want參數(shù)的entities不為空,待匹配Ability的skills配置中的entities不為空且包含調(diào)用方傳入的want參數(shù)的entities,則entities匹配成功。
調(diào)用方傳入的want參數(shù)的entities不為空,待匹配Ability的skills配置中的entities不為空且不完全包含調(diào)用方傳入的want參數(shù)的entities,則entities匹配失敗。
圖2 want參數(shù)的entities匹配規(guī)則
調(diào)用方傳入的want參數(shù)中設(shè)置uri和type參數(shù)發(fā)起組件啟動請求,系統(tǒng)會遍歷當(dāng)前系統(tǒng)已安裝的組件列表,并逐個匹配待匹配Ability的skills配置中的uris數(shù)組,如果待匹配Ability的skills配置中的uris數(shù)組中只要有一個可以匹配調(diào)用方傳入的want參數(shù)中設(shè)置的uri和type即為匹配成功。
圖3 want參數(shù)中uri和type皆不為空時的匹配規(guī)則
實(shí)際應(yīng)用中,uri和type共存在四種情況,下面將講解四種情況的具體匹配規(guī)則:
調(diào)用方傳入的want參數(shù)的uri和type都為空。
調(diào)用方傳入的want參數(shù)的uri不為空,type為空。
調(diào)用方傳入的want參數(shù)的uri為空,type不為空。
調(diào)用方傳入的want參數(shù)的uri和type都不為空,如圖3所示。
下圖為了簡化描述,稱want中傳入的uri為w_uri,稱want中傳入的type為w_type, 待匹配Ability的skills配置中uris為s_uris,其中每個元素為s_uri;按自上而下順序匹配。
圖4 want參數(shù)中uri和type的具體匹配規(guī)則
這里為了簡化描述,稱want中傳入的uri為w_uri,待匹配Ability的skills配置中uri為s_uri,具體的匹配規(guī)則如下:
如果s_uri的scheme為空,當(dāng)w_uri為空時匹配成功,否則匹配失敗;
如果s_uri的host為空,當(dāng)w_uri和s_uri的scheme相同時匹配成功,否則匹配失??;
如果s_uri的path、pathStartWith和pathRegex都為空,當(dāng)w_uri和s_uri完全相同時匹配成功,否則匹配失??;
如果s_uri的path不為空,當(dāng)w_uri和s_uri全路徑表達(dá)式相同時匹配成功,否則繼續(xù)進(jìn)行pathStartWith的匹配;
如果s_uri的pathStartWith不為空,當(dāng)w_uri包含s_uri前綴表達(dá)式時匹配成功,否則繼續(xù)進(jìn)行pathRegex的匹配;
如果s_uri的pathRegex不為空,當(dāng)w_uri滿足s_uri正則表達(dá)式時匹配成功,否則匹配失敗;
待匹配Ability的skills配置的uris中scheme、host、port、path、pathStartWith和pathRegex屬性拼接,如果依次聲明了path、pathStartWith和pathRegex屬性時,uris將分別拼接為如下三種表達(dá)式:
全路徑表達(dá)式:scheme://host:port/path
前綴表達(dá)式:scheme://host:port/pathStartWith
正則表達(dá)式:scheme://host:port/pathRegex
此小節(jié)所述的type匹配規(guī)則的適用性需建立在want參數(shù)內(nèi)type不為空的基礎(chǔ)上。當(dāng)want參數(shù)內(nèi)type為空時請參考want參數(shù)的uri和type匹配規(guī)則。
這里為了簡化描述,稱want中傳入的uri為w_type,待匹配Ability的skills數(shù)組中uris的type數(shù)據(jù)為s_type,具體的匹配規(guī)則如下:
如果s_type為空,則匹配失敗。
如果s_type或者w_type為通配符"*/*",則匹配成功。
如果s_type最后一個字符為通配符'*',如"prefixType/*",則當(dāng)w_type包含"prefixType/"時匹配成功,否則匹配失敗。
如果w_type最后一個字符為通配符'*',如"prefixType/*",則當(dāng)s_type包含"prefixType/"時匹配成功,否則匹配失敗。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: