<uri-relative-filter-group>

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 nach android:allow-Attribut können es Einschluss- (allow) oder Ausschlussregeln (blocking) sein. Die Abgleichsregeln werden durch die Attribute path*, fragment* und query* 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&param2=value2&param3=value3 überein, da alle Elemente vorhanden sind, die in der URI-relativen Filtergruppe angegeben sind. Der Filter stimmt auch mit https://project.example.com/any/path/here?param2=value2&param1=value1 überein, da die Reihenfolge der Abfrageparameter keine Rolle spielt. Der Filter stimmt jedoch nicht mit https://project.example.com/any/path/here?param1=value1 überein, da param2=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 mit suffix enden.

Im nächsten Beispiel werden dagegen Pfade mit /prefix als Anfang und suffix 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 das port-Attribut und alle path*-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 einem Intent abgleichen möchten. Wenn Sie einen Intent-Filter erstellen möchten, der mit https://project.example.com/path übereinstimmt und https://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 unter UriRelativeFilterGroup und UriRelativeFilter.

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>