- składnia:
-
<uri-relative-filter-group android:allow=["true" | "false"]> <data ... /> ... </uri-relative-filter-group>
- zawiera się w:
-
<intent-filter> - Może zawierać:
-
<data> - description:
-
Tworzy precyzyjne reguły dopasowywania
Intent, które mogą zawierać parametry zapytania URI i fragmenty URI. W zależności od atrybutuandroid:allowreguły mogą być regułami uwzględniania (zezwalającymi) lub wykluczania (blokującymi). Reguły dopasowywania są określone przez atrybutypath*,fragment*iquery*elementów<data>.Dopasowywanie
Aby dopasować identyfikator URI, każda część grupy filtrów względnych identyfikatora URI musi pasować do części identyfikatora URI. Mogą istnieć części identyfikatora URI, które nie są określone w grupie filtrów względnych identyfikatora URI. Na przykład:
<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>
Filtr pasuje do
https://project.example.com/any/path/here?param1=value1¶m2=value2¶m3=value3, ponieważ zawiera wszystkie elementy określone przez grupę filtrów URI względny. Filtr pasuje też do adresu URLhttps://project.example.com/any/path/here?param2=value2¶m1=value1, ponieważ kolejność parametrów zapytania nie ma znaczenia. Filtr nie pasuje jednak dohttps://project.example.com/any/path/here?param1=value1, w którym brakujeparam2=value2.OR i AND
Tagi
<data>poza elementem<uri-relative-filter-group>są łączone operatorem OR, a tagi<data>w elemencie<uri-relative-filter-group>są łączone operatorem AND.Przyjrzyj się temu przykładowi:
<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <data android:pathPrefix="/prefix" /> <data android:pathSuffix="suffix" /> ... </intent-filter>
Filtr pasuje do ścieżek, które zaczynają się od
/prefixLUB kończą się nasuffix.Natomiast następny przykład pasuje do ścieżek, które zaczynają się od
/prefixI kończą się nasuffix:<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>
W rezultacie wiele atrybutów
pathw tym samym<uri-relative-filter-group>nie pasuje do niczego:<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>
Kolejność deklaracji
Przyjrzyj się temu przykładowi:
<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>
Filtr pasuje do fragmentu
#fragment, ponieważ dopasowanie zostało znalezione przed oceną reguły wykluczania, ale fragmenty takie jak#fragment123nie pasują.Tagi pokrewne
<uri-relative-filter-group>Tagi współpracują z tagami<data>(czyli tagami<data>, które znajdują się poza tagiem<uri-relative-filter-group>, ale w tym samym tagu<intent-filter>). Tagi<uri-relative-filter-group>muszą mieć tagi<data>, aby działać prawidłowo, ponieważ atrybuty URI są wzajemnie zależne na poziomie<intent-filter>:- Jeśli dla filtra intencji nie określono elementu
scheme, wszystkie pozostałe atrybuty URI są ignorowane. - Jeśli dla filtra nie określono atrybutu
host, atrybutporti wszystkie atrybutypath*są ignorowane.
Elementy podrzędne
<data>elementu<intent-filter>są oceniane przed tagami<uri-relative-filter-group>. Następnie tagi<uri-relative-filter-group>są oceniane po kolei, np.:<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>
Filtr akceptuje wartość
https://project.example.com/path?query, ponieważ pasuje ona do wzorca<data android:path="/path" />, który nie jest objęty regułą wykluczania<uri-relative-filter-group>.Częsty przypadek użycia
Załóżmy, że masz identyfikator URI
https://project.example.com/path, który chcesz dopasować do identyfikatoraIntentw zależności od obecności lub wartości parametru zapytania. Aby utworzyć filtr intencji, który pasuje dohttps://project.example.com/pathi blokujehttps://project.example.com/path?query, możesz użyć takiego kodu:<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>
To jednak nie działa.
https://project.example.com/path?queryURI dopasowuje ścieżkę/path, a tag<uri-relative-filter-group>umożliwia dopasowywanie dodatkowych części.Zmodyfikuj filtr intencji w ten sposób:
<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>
Ten filtr działa, ponieważ najpierw są sprawdzane reguły blokowania, które zabraniają stosowania niepustych parametrów zapytania.
Aby uprościć kod, odwróć działanie, tak aby zezwalać na parametry zapytania i blokować identyfikatory URI bez parametrów zapytania:
<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>
Znaki zakodowane w identyfikatorze URI
Aby dopasować identyfikatory URI zawierające znaki zakodowane w formacie URI, wpisz w filtrze nieprzetworzone, niezakodowane znaki, np.:
<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>
Filtr pasuje do
?param=value!i?param=value%21.Jeśli jednak wpiszesz w filtrze zakodowane znaki w ten sposób:
<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>
Filtr nie pasuje ani do
?param=value!, ani do?param=value%21.Liczba elementów
W elemencie
<uri-relative-filter-group>możesz umieścić dowolną liczbę elementów<intent-filter>.Dodatkowe materiały
Informacje o działaniu filtrów intencji, w tym reguły dopasowywania obiektów intencji do filtrów, znajdziesz w artykułach Intencje i filtry intencji oraz Filtry intencji.
Informacje o
<uri-relative-filter-group>znajdziesz w sekcjachUriRelativeFilterGroupiUriRelativeFilter. - Jeśli dla filtra intencji nie określono elementu
- atrybuty:
-
android:allow- Określa, czy ta grupa filtrów względnych identyfikatorów URI jest regułą uwzględniania (zezwalającą), a nie regułą wykluczania (blokującą). Wartością domyślną jest
"true".Wartość Opis "true"(domyślnie)Jeśli grupa filtrów względnych identyfikatorów URI pasuje, filtr intencji pasuje "false"Jeśli grupa filtrów względnych identyfikatora URI pasuje, filtr intencji nie pasuje.
- wprowadzony w:
- Poziom API 35
- Zobacz też:
-
<intent-filter><data>
<uri-relative-filter-group>
Treść strony i umieszczone na niej fragmenty kodu podlegają licencjom opisanym w Licencji na treści. Java i OpenJDK są znakami towarowymi lub zastrzeżonymi znakami towarowymi należącymi do firmy Oracle lub jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2026-04-21 UTC.
[null,null,["Ostatnia aktualizacja: 2026-04-21 UTC."],[],[]]