<uri-relative-filter-group>

syntax:
<uri-relative-filter-group android:allow=["true" | "false"]>
  <data ... />
  ...
</uri-relative-filter-group>
contenuti in:
<intent-filter>
può contenere:
<data>
description:
Crea regole di corrispondenza Intent precise che possono includere parametri di query e frammenti URI. Le regole possono essere di inclusione (allow) o di esclusione (blocking), a seconda dell'attributo android:allow. Le regole di corrispondenza sono specificate dagli attributi path*, fragment* e query* degli elementi <data> contenuti.

Corrispondenza

Per trovare una corrispondenza con un URI, ogni parte del gruppo di filtri relativi all'URI deve corrispondere a una parte dell'URI. Possono essere presenti parti dell'URI non specificate nel gruppo di filtri relativo all'URI. Ad esempio:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="true">
    <data android:query="param1=value1" />
    <data android:query="param2=value2" />
  </uri-relative-filter-group>
  ...
</intent-filter>

Il filtro corrisponde https://project.example.com/any/path/here?param1=value1&param2=value2&param3=value3 perché è presente tutto ciò che è specificato dal gruppo di filtri relativo all'URI. Il filtro corrisponde anche a https://project.example.com/any/path/here?param2=value2&param1=value1 perché l'ordine dei parametri di query non è importante. Tuttavia, il filtro non corrisponde https://project.example.com/any/path/here?param1=value1, a cui manca param2=value2.

OR e AND

I tag <data> all'esterno di un <uri-relative-filter-group> sono OR, mentre i tag <data> all'interno di un <uri-relative-filter-group> sono AND.

Considera l'esempio seguente:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <data android:pathPrefix="/prefix" />
  <data android:pathSuffix="suffix" />
  ...
</intent-filter>

Il filtro corrisponde ai percorsi che iniziano con /prefix OPPURE terminano con suffix.

Al contrario, l'esempio seguente corrisponde ai percorsi che iniziano con /prefix e terminano con suffix:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group>
    <data android:pathPrefix="/prefix" />
    <data android:pathSuffix="suffix" />
  </uri-relative-filter-group>
  ...
</intent-filter>

Di conseguenza, più attributi path nello stesso <uri-relative-filter-group> non corrispondono a nulla:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group>
    <data android:path="/path1" />
    <data android:path="/path2" />
  </uri-relative-filter-group>
  ...
</intent-filter>

Ordine di dichiarazione

Considera l'esempio seguente:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group>
    <data android:fragment="fragment" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:fragmentPrefix="fragment" />
  </uri-relative-filter-group>
  ...
</intent-filter>

Il filtro corrisponde al frammento #fragment perché viene trovata una corrispondenza prima della valutazione della regola di esclusione, ma i frammenti come #fragment123 non corrispondono.

Tag fratelli

I tag <uri-relative-filter-group> funzionano insieme ai tag <data> fratelli (ovvero i tag <data> al di fuori del <uri-relative-filter-group>, ma all'interno dello stesso <intent-filter>). I tag <uri-relative-filter-group> devono avere tag <data> fratelli per funzionare correttamente perché gli attributi URI sono mutuamente dipendenti a livello di <intent-filter>:

  • Se per il filtro intent non viene specificato un valore scheme, tutti gli altri attributi URI vengono ignorati.
  • Se per il filtro non viene specificato un valore host, l'attributo port e tutti gli attributi path* vengono ignorati.

I figli <data> di un <intent-filter> vengono valutati prima di qualsiasi tag <uri-relative-filter-group>. Poi i tag <uri-relative-filter-group> vengono valutati in ordine, ad esempio:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="false">
    <data android:path="/path" />
    <data android:query="query" />
  </uri-relative-filter-group>
  <data android:path="/path" />
  ...
</intent-filter>

Il filtro accetta https://project.example.com/path?query perché corrisponde a <data android:path="/path" />, che non rientra nella regola di esclusione <uri-relative-filter-group>.

Caso d'uso comune

Immagina di avere l'URI https://project.example.com/path, che vuoi associare a un Intent a seconda della presenza o del valore di un parametro di query. Per creare un filtro intent che corrisponda a https://project.example.com/path e blocchi https://project.example.com/path?query, puoi provare qualcosa di simile a:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="true">
    <data android:path="/path" />
  </uri-relative-filter-group>
  ...
</intent-filter>

In realtà, non funziona. L'URI https://project.example.com/path?query corrisponde al percorso /path e il tag <uri-relative-filter-group> consente parti extra durante la corrispondenza.

Modifica il filtro per intent come segue:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="false">
    <data android:path="/path" />
    <data android:queryAdvancedPattern=".+" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="true">
    <data android:path="/path" />
  </uri-relative-filter-group>
  ...
</intent-filter>

Questo filtro funziona perché le regole di blocco che vietano i parametri di query non vuoti vengono valutate per prime.

Per semplificare il codice, inverti il comportamento in modo da consentire i parametri di query e bloccare gli URI senza parametri di query:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="true">
    <data android:path="/path" />
    <data android:queryAdvancedPattern=".+" />
  </uri-relative-filter-group>
  ...
</intent-filter>

Caratteri codificati in formato URI

Per trovare una corrispondenza con gli URI contenenti caratteri codificati, scrivi i caratteri non codificati nel filtro, ad esempio:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="true">
    <data android:query="param=value!" />
  </uri-relative-filter-group>
  ...
</intent-filter>

Il filtro corrisponde a ?param=value! e ?param=value%21.

Tuttavia, se nel filtro scrivi i caratteri codificati come segue:

<intent-filter...>
  <data android:scheme="https" android:host="project.example.com" />
  <uri-relative-filter-group android:allow="true">
    <data android:query="param=value%21" />
  </uri-relative-filter-group>
  ...
</intent-filter>

Il filtro non corrisponde né a ?param=value! né a ?param=value%21.

Numero di elementi

Puoi inserire un numero illimitato di elementi <uri-relative-filter-group> all'interno di un <intent-filter>.

Altre risorse

Per informazioni sul funzionamento dei filtri per intent, incluse le regole per la corrispondenza degli oggetti intent ai filtri, consulta Intent e filtri per intent e Filtri per intent.

Per informazioni su <uri-relative-filter-group>, consulta UriRelativeFilterGroup e UriRelativeFilter.

attributes:
android:allow
Indica se questo gruppo di filtri relativo all'URI è una regola di inclusione (consenti) anziché una regola di esclusione (blocco). Il valore predefinito è "true".
Valore Descrizione
"true" (valore predefinito) Se il gruppo di filtri relativi all'URI corrisponde, il filtro per intent corrisponde
"false" Se il gruppo di filtri relativi all'URI corrisponde, il filtro per intent non corrisponde
introdotto in:
Livello API 35
Vedi anche:
<intent-filter>
<data>