<uri-relative-filter-group>

söz dizimi:
<uri-relative-filter-group android:allow=["true" | "false"]>
  <data ... />
  ...
</uri-relative-filter-group>
Şunlarda bulunur:
<intent-filter>
Şunları içerebilir:
<data>
description:
URI sorgu parametreleri ve URI parçaları içerebilecek hassas Intent eşleme kuralları oluşturur. Kurallar, android:allow özelliğine bağlı olarak dahil etme (izin verme) veya hariç tutma (engelleme) kuralları olabilir. Eşleştirme kuralları, dahil edilen <data> öğelerinin path*, fragment* ve query* özellikleri tarafından belirtilir.

Eşleşme

Bir URI ile eşleşmek için URI'ye göre filtre grubunun her bir bölümünün URI'nin bir kısmıyla eşleşmesi gerekir. URI'nin, URI'ye göre filtre grubunda belirtilmeyen bölümleri olabilir. Örnek:

<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>

URI'ye göreli filtre grubu tarafından belirtilen her şey mevcut olduğu için filtre, https://project.example.com/any/path/here?param1=value1&param2=value2&param3=value3 ile eşleşir. Sorgu parametrelerinin sırası önemli olmadığı için filtre, https://project.example.com/any/path/here?param2=value2&param1=value1 ile de eşleşir. Ancak filtre, param2=value2 eksik olan https://project.example.com/any/path/here?param1=value1 ile eşleşmiyor.

VEYA ve VE

<uri-relative-filter-group> dışındaki <data> etiketleri OR işlemine tabi tutulurken <uri-relative-filter-group> içindeki <data> etiketleri AND işlemine tabi tutulur.

Aşağıdaki örneği inceleyin:

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

Filtre, /prefix ile başlayan VEYA suffix ile biten yollarla eşleşir.

Buna karşılık, aşağıdaki örnek /prefix ile başlayan VE suffix ile biten yollarla eşleşir:

<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>

Sonuç olarak, aynı <uri-relative-filter-group> alanındaki birden fazla path özelliği hiçbir şeyle eşleşmez:

<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>

Beyan sırası

Aşağıdaki örneği inceleyin:

<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>

Hariç tutma kuralı değerlendirilmeden önce bir eşleşme bulunduğu için filtre, #fragment fragmanıyla eşleşir ancak #fragment123 gibi fragmanlar eşleşmez.

Kardeş etiketler

<uri-relative-filter-group> etiketleri, kardeş <data> etiketleriyle birlikte çalışır (yani, <uri-relative-filter-group> dışında ancak aynı <intent-filter> içinde bulunan <data> etiketleri). URI özellikleri <intent-filter> düzeyinde birbirine bağlı olduğundan <uri-relative-filter-group> etiketlerinin düzgün çalışması için kardeş <data> etiketleri olmalıdır:

  • Intent filtresi için bir scheme belirtilmezse diğer tüm URI özellikleri yoksayılır.
  • Filtre için bir host belirtilmezse port özelliği ve tüm path* özellikleri yok sayılır.

Bir <intent-filter>'un <data> alt hesapları, tüm <uri-relative-filter-group> etiketlerinden önce değerlendirilir. Ardından <uri-relative-filter-group> etiketleri sırayla değerlendirilir. Örneğin:

<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>

Filtre, <uri-relative-filter-group> hariç tutma kuralının dışındaki <data android:path="/path" /> ile eşleştiği için https://project.example.com/path?query değerini kabul eder.

Yaygın kullanım alanı

Bir sorgu parametresinin varlığına veya değerine bağlı olarak https://project.example.com/path URI'niz olduğunu ve bu URI'yi Intent ile eşleştirmek istediğinizi varsayalım. https://project.example.com/path ile eşleşen ve https://project.example.com/path?query'u engelleyen bir intent filtresi oluşturmak için aşağıdaki gibi bir ifadeyi deneyebilirsiniz:

<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>

Bu aslında işe yaramaz. https://project.example.com/path?query URI'si, /path yolunu eşleştirir ve <uri-relative-filter-group> etiketi, eşleşirken ek parçalara izin verir.

Intent filtresini aşağıdaki şekilde düzeltin:

<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>

Bu filtre, boş olmayan sorgu parametrelerini yasaklayan engelleme kurallarının önce değerlendirilmesi nedeniyle çalışır.

Kodu basitleştirmek için davranışı, sorgu parametrelerine izin verecek ve sorgu parametresi olmayan URI'leri engelleyecek şekilde değiştirin:

<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 kodlamalı karakterler

URI kodlamalı karakterler içeren URI'leri eşleştirmek için filtreye ham, kodlanmamış karakterleri yazın. Örneğin:

<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>

Filtre, ?param=value! ve ?param=value%21 ile eşleşiyor.

Ancak filtreye kodlanmış karakterleri aşağıdaki gibi yazarsanız:

<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>

Filtre, ?param=value! veya ?param=value%21 ile eşleşmiyor.

Öğe sayısı

Bir <intent-filter> içine dilediğiniz sayıda <uri-relative-filter-group> öğesi yerleştirebilirsiniz.

Ek kaynaklar

Intent nesnelerinin filtrelerle eşleşme kuralları da dahil olmak üzere intent filtrelerinin işleyiş şekli hakkında bilgi edinmek için Intent'ler ve Intent Filtreleri ile Intent Filtreleri başlıklı makaleleri inceleyin.

<uri-relative-filter-group> hakkında bilgi edinmek için UriRelativeFilterGroup ve UriRelativeFilter başlıklı makaleleri inceleyin.

özellikleri:
android:allow
Bu URI'ye göreli filtre grubunun, hariç tutma (engelleme) kuralı yerine dahil etme (izin verme) kuralı olup olmadığı. Varsayılan değer: "true".
Değer Açıklama
"true" (varsayılan) URI'ye göre filtre grubu eşleşirse intent filtresi de eşleşir
"false" URI'ye göreli filtre grubu eşleşirse intent filtresi eşleşmez
kullanıma sunulduğu sürüm:
API düzeyi 35
Ayrıca:
<intent-filter>
<data>