- syntax:
-
<uri-relative-filter-group android:allow=["true" | "false"]> <data ... /> ... </uri-relative-filter-group>
- enthalten in:
-
<intent-filter>
- kann Folgendes enthalten:
-
<data>
- description:
-
Erstellen präziser
Intent
-Abgleichsregeln, die URI-Abfrageparameter und URI-Fragmente enthalten können. Je nachandroid:allow
-Attribut können es Einschluss- (allow) oder Ausschlussregeln (blocking) sein. Die Abgleichsregeln werden durch die Attributepath*
,fragment*
undquery*
der enthaltenen<data>
-Elemente angegeben.Abgleich
Damit eine Übereinstimmung mit einem URI erzielt werden kann, muss jeder Teil der relativen Filtergruppe des URI mit einem Teil des URI übereinstimmen. Es kann Teile des URI geben, die nicht in der URI-relativen Filtergruppe angegeben sind. Beispiel:
<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>
Der Filter stimmt mit
https://project.example.com/any/path/here?param1=value1¶m2=value2¶m3=value3
überein, da alle Elemente vorhanden sind, die in der URI-relativen Filtergruppe angegeben sind. Der Filter stimmt auch mithttps://project.example.com/any/path/here?param2=value2¶m1=value1
überein, da die Reihenfolge der Abfrageparameter keine Rolle spielt. Der Filter stimmt jedoch nicht mithttps://project.example.com/any/path/here?param1=value1
überein, daparam2=value2
fehlt.OR und AND
<data>
-Tags außerhalb eines<uri-relative-filter-group>
werden mit OR verknüpft, während<data>
-Tags innerhalb eines<uri-relative-filter-group>
mit AND verknüpft werden.Betrachten Sie das folgende Beispiel:
<intent-filter...> <data android:scheme="https" android:host="project.example.com" /> <data android:pathPrefix="/prefix" /> <data android:pathSuffix="suffix" /> ... </intent-filter>
Der Filter stimmt mit Pfaden überein, die mit
/prefix
beginnen ODER mitsuffix
enden.Im nächsten Beispiel werden dagegen Pfade mit
/prefix
als Anfang undsuffix
als Ende abgeglichen:<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>
Daher stimmen mehrere
path
-Attribute im selben<uri-relative-filter-group>
mit nichts überein:<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>
Beschreibung der Reihenfolge der Erklärungen
Betrachten Sie das folgende Beispiel:
<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>
Der Filter stimmt mit dem Fragment
#fragment
überein, da eine Übereinstimmung gefunden wird, bevor die Ausschlussregel ausgewertet wird. Fragmente wie#fragment123
stimmen jedoch nicht überein.Nebeneinander liegende Tags
<uri-relative-filter-group>
-Tags funktionieren zusammen mit ihren<data>
-Schwester-Tags (<data>
-Tags, die sich nicht im<uri-relative-filter-group>
, aber im selben<intent-filter>
befinden).<uri-relative-filter-group>
-Tags müssen<data>
-Schwester-Tags haben, damit sie richtig funktionieren, da URI-Attribute auf<intent-filter>
-Ebene gegenseitig voneinander abhängig sind:- Wenn für den Intent-Filter kein
scheme
angegeben ist, werden alle anderen URI-Attribute ignoriert. - Wenn für den Filter kein
host
angegeben ist, werden dasport
-Attribut und allepath*
-Attribute ignoriert.
Die
<data>
-Kinder eines<intent-filter>
werden vor allen<uri-relative-filter-group>
-Tags ausgewertet. Anschließend werden die<uri-relative-filter-group>
-Tags der Reihe nach ausgewertet, z. 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:query="query" /> </uri-relative-filter-group> <data android:path="/path" /> ... </intent-filter>
https://project.example.com/path?query
wird vom Filter akzeptiert, da es mit<data android:path="/path" />
übereinstimmt, das nicht von der Ausschlussregel<uri-relative-filter-group>
abgedeckt ist.Gängiger Anwendungsfall
Angenommen, Sie haben den URI
https://project.example.com/path
, den Sie je nach Vorhandensein oder Wert eines Abfrageparameters mit einemIntent
abgleichen möchten. Wenn Sie einen Intent-Filter erstellen möchten, der mithttps://project.example.com/path
übereinstimmt undhttps://project.example.com/path?query
blockiert, können Sie Folgendes versuchen:<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>
Das funktioniert aber nicht. Der URI
https://project.example.com/path?query
stimmt mit dem Pfad/path
überein und das Tag<uri-relative-filter-group>
erlaubt zusätzliche Teile, wenn eine Übereinstimmung vorliegt.Ändern Sie den Intent-Filter so:
<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>
Dieser Filter funktioniert, da die Blockierungsregeln, die leere Abfrageparameter verbieten, zuerst ausgewertet werden.
Um den Code zu vereinfachen, können Sie das Verhalten umkehren, sodass Abfrageparameter zugelassen und URIs ohne Abfrageparameter blockiert werden:
<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>
URI-codierte Zeichen
Wenn Sie URIs mit URI-codierten Zeichen abgleichen möchten, geben Sie die Rohzeichen ohne Codierung in den Filter ein, z. B.:
<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>
Der Filter stimmt mit
?param=value!
und?param=value%21
überein.Wenn Sie codierte Zeichen jedoch so in den Filter schreiben:
<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>
Der Filter stimmt weder mit
?param=value!
noch mit?param=value%21
überein.Anzahl der Elemente
Sie können beliebig viele
<uri-relative-filter-group>
-Elemente in einem<intent-filter>
platzieren.Weitere Informationen
Informationen zur Funktionsweise von Intent-Filtern, einschließlich der Regeln für die Abgleiche von Intent-Objekten mit Filtern, finden Sie unter Intents und Intent-Filter und Intent-Filter.
Informationen zu
<uri-relative-filter-group>
finden Sie unterUriRelativeFilterGroup
undUriRelativeFilter
. - Wenn für den Intent-Filter kein
- attributes:
-
android:allow
-
Gibt an, ob diese URI-relative Filtergruppe eine Einschlussregel (allow) und keine Ausschlussregel (blocking) ist. Der Standardwert ist
"true"
.Wert Beschreibung "true"
(Standard)Wenn die URI-relative Filtergruppe übereinstimmt, stimmt der Intent-Filter überein. "false"
Die relative URI-Filtergruppe stimmt überein, der Intent-Filter stimmt nicht überein
- eingeführt in:
- API-Level 35
- Weitere Informationen:
-
<intent-filter>
<data>
Alle Inhalte und Codebeispiele auf dieser Seite unterliegen den Lizenzen wie im Abschnitt Inhaltslizenz beschrieben. Java und OpenJDK sind Marken oder eingetragene Marken von Oracle und/oder seinen Tochtergesellschaften.
Zuletzt aktualisiert: 2024-12-21 (UTC).
[null,null,["Zuletzt aktualisiert: 2024-12-21 (UTC)."],[],[]]