顯式Want與隱式Want匹配規(guī)則

2024-01-25 12:25 更新

在啟動目標Ability時,會通過顯式Want和隱式Want進行目標Ability的匹配,這里說的匹配規(guī)則就是調(diào)用方Want中設置的參數(shù)如何與目標Ability聲明的配置文件進行匹配。

  • 顯式Want匹配原理

    名稱

    類型

    匹配項

    必選

    規(guī)則

    deviceId

    string

    留空將僅匹配本設備內(nèi)Ability。

    bundleName

    string

    如果指定abilityName,而不指定bundleName,則匹配失敗。

    moduleName

    string

    留空時當同一個應用內(nèi)存在多個模塊且模塊間存在重名Ability,將默認匹配第一個。

    abilityName

    string

    該字段必須設置表示顯式匹配。

    uri

    string

    系統(tǒng)匹配時將忽略該參數(shù),但仍可作為參數(shù)傳遞給目標Ability。

    type

    string

    系統(tǒng)匹配時將忽略該參數(shù),但仍可作為參數(shù)傳遞給目標Ability。

    action

    string

    系統(tǒng)匹配時將忽略該參數(shù),但仍可作為參數(shù)傳遞給目標Ability。

    entities

    Array<string>

    系統(tǒng)匹配時將忽略該參數(shù),但仍可作為參數(shù)傳遞給目標Ability。

    flags

    number

    不參與匹配,直接傳遞給系統(tǒng)處理,一般用來設置運行態(tài)信息,例如URI數(shù)據(jù)授權等。

    parameters

    {[key: string]: any}

    不參與匹配,應用自定義數(shù)據(jù)將直接傳遞給目標Ability。

  • 隱式Want匹配原理

    名稱

    類型

    匹配項

    必選

    規(guī)則

    deviceId

    string

    跨設備目前不支持隱式調(diào)用。

    說明

    當前版本暫不支持跨設備能力。

    abilityName

    string

    該字段必須留空表示隱式匹配。

    bundleName

    string

    - 聲明bundleName時,隱式搜索將僅限于對應應用包內(nèi)。

    - 聲明bundleName與moduleName時,隱式搜索將僅限于對應應用的對應Module內(nèi)。

    - 單獨聲明moduleName時,該字段無效。

    - 同時聲明bundleName與moduleName時,隱式搜索將僅限于對應應用包內(nèi)的對應模塊內(nèi)。

    這些字段將用來隱式匹配,具體規(guī)則可參考隱式Want匹配原理詳解。

    moduleName

    string

    -

    uri

    string

    -

    type

    string

    -

    action

    string

    -

    entities

    Array<string>

    -

    flags

    number

    不參與匹配,直接傳遞給系統(tǒng)處理,一般用來設置運行態(tài)信息,例如URI數(shù)據(jù)授權等。

    parameters

    {[key: string]: any}

    不參與匹配,應用自定義數(shù)據(jù)將直接傳遞給目標Ability。

隱式Want匹配原理詳解

從隱式Want的定義,可得知:

  • 調(diào)用方傳入的want參數(shù),表明調(diào)用方需要執(zhí)行的操作,并提供相關數(shù)據(jù)以及其他應用類型限制。

  • 待匹配Ability的skills配置,聲明其具備的能力(module.json5配置文件中的skills標簽參數(shù))。

系統(tǒng)將調(diào)用方傳入的want參數(shù)(包含action、entities、uri和type屬性)與已安裝待匹配的應用Ability的skills配置(包含actions、entities、uris和type屬性)依次進行匹配。當四個屬性匹配均通過,則此應用才會被應用選擇器展示給用戶進行選擇。

want參數(shù)的action匹配規(guī)則

將調(diào)用方傳入的want參數(shù)的action與待匹配Ability的skills配置中的actions進行匹配。

  • 調(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不為空,則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ī)則

want參數(shù)的entities匹配規(guī)則

將調(diào)用方傳入的want參數(shù)的entities與待匹配Ability的skills配置中的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為空,則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ī)則

want參數(shù)的uri和type匹配規(guī)則

調(diào)用方傳入的want參數(shù)中設置uri和type參數(shù)發(fā)起組件啟動請求,系統(tǒng)會遍歷當前系統(tǒng)已安裝的組件列表,并逐個匹配待匹配Ability的skills配置中的uris數(shù)組,如果待匹配Ability的skills配置中的uris數(shù)組中只要有一個可以匹配調(diào)用方傳入的want參數(shù)中設置的uri和type即為匹配成功。

圖3 want參數(shù)中uri和type皆不為空時的匹配規(guī)則

實際應用中,uri和type共存在四種情況,下面將講解四種情況的具體匹配規(guī)則:

  • 調(diào)用方傳入的want參數(shù)的uri和type都為空。

    1. 如果待匹配Ability的skills配置中的uris數(shù)組為空,匹配成功。
    2. 如果待匹配Ability的skills配置中的uris數(shù)組中存在uri的scheme和type都為空的元素,匹配成功。
    3. 除以上兩種情況,其他情況均為匹配失敗。
  • 調(diào)用方傳入的want參數(shù)的uri不為空,type為空。

    1. 如果待匹配Ability的skills配置中的uris數(shù)組為空,匹配失敗。
    2. 如果待匹配Ability的skills配置中的uris數(shù)組存在一條數(shù)據(jù)uri匹配成功且type為空,則匹配成功,否則匹配失敗。
  • 調(diào)用方傳入的want參數(shù)的uri為空,type不為空。

    1. 如果待匹配Ability的skills配置中的uris數(shù)組為空,匹配失敗。
    2. 如果待匹配Ability的skills配置中的uris數(shù)組存在一條數(shù)據(jù)uri的scheme為空且type匹配成功,則匹配成功,否則匹配失敗。
  • 調(diào)用方傳入的want參數(shù)的uri和type都不為空,如圖3所示。

    1. 如果待匹配Ability的skills配置中的uris數(shù)組為空,匹配失敗。
    2. 如果待匹配Ability的skills配置中的uris數(shù)組存在一條數(shù)據(jù)uri匹配type匹配需要均匹配成功,則匹配成功,否則匹配失敗。

下圖為了簡化描述,稱want中傳入的uri為w_uri,稱want中傳入的type為w_type, 待匹配Ability的skills配置中uris為s_uris,其中每個元素為s_uri;按自上而下順序匹配。

圖4 want參數(shù)中uri和type的具體匹配規(guī)則

uri匹配規(guī)則

這里為了簡化描述,稱want中傳入的uri為w_uri,待匹配Ability的skills配置中uri為s_uri,具體的匹配規(guī)則如下:

  • 如果s_uri的scheme為空,當w_uri為空時匹配成功,否則匹配失敗;

  • 如果s_uri的host為空,當w_uri和s_uri的scheme相同時匹配成功,否則匹配失敗;

  • 如果s_uri的path、pathStartWith和pathRegex都為空,當w_uri和s_uri完全相同時匹配成功,否則匹配失?。?/p>

  • 如果s_uri的path不為空,當w_uri和s_uri全路徑表達式相同時匹配成功,否則繼續(xù)進行pathStartWith的匹配;

  • 如果s_uri的pathStartWith不為空,當w_uri包含s_uri前綴表達式時匹配成功,否則繼續(xù)進行pathRegex的匹配;

  • 如果s_uri的pathRegex不為空,當w_uri滿足s_uri正則表達式時匹配成功,否則匹配失?。?/p>

說明

待匹配Ability的skills配置的uris中scheme、host、port、path、pathStartWith和pathRegex屬性拼接,如果依次聲明了path、pathStartWith和pathRegex屬性時,uris將分別拼接為如下三種表達式:

  • 全路徑表達式:scheme://host:port/path

  • 前綴表達式:scheme://host:port/pathStartWith

  • 正則表達式:scheme://host:port/pathRegex

type匹配規(guī)則

說明

此小節(jié)所述的type匹配規(guī)則的適用性需建立在want參數(shù)內(nèi)type不為空的基礎上。當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/*",則當w_type包含"prefixType/"時匹配成功,否則匹配失敗。

  • 如果w_type最后一個字符為通配符'*',如"prefixType/*",則當s_type包含"prefixType/"時匹配成功,否則匹配失敗。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號