- 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'attributoandroid:allow
. Le regole di corrispondenza sono specificate dagli attributipath*
,fragment*
equery*
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¶m2=value2¶m3=value3
perché è presente tutto ciò che è specificato dal gruppo di filtri relativo all'URI. Il filtro corrisponde anche ahttps://project.example.com/any/path/here?param2=value2¶m1=value1
perché l'ordine dei parametri di query non è importante. Tuttavia, il filtro non corrispondehttps://project.example.com/any/path/here?param1=value1
, a cui mancaparam2=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 consuffix
.Al contrario, l'esempio seguente corrisponde ai percorsi che iniziano con
/prefix
e terminano consuffix
:<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'attributoport
e tutti gli attributipath*
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 unIntent
a seconda della presenza o del valore di un parametro di query. Per creare un filtro intent che corrisponda ahttps://project.example.com/path
e blocchihttps://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>
, consultaUriRelativeFilterGroup
eUriRelativeFilter
. - Se per il filtro intent non viene specificato un valore
- 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>
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2024-12-21 UTC.
[null,null,["Ultimo aggiornamento 2024-12-21 UTC."],[],[]]