<uri-relative-filter-group>

söz dizimi:
<uri-relative-filter-group android:allow=["true" | "false"]>
  <data ... />
  ...
</uri-relative-filter-group>
içerdiği:
<intent-filter>
Şunları içerebilir:
<data>
description:
URI sorgu parametrelerini ve URI parçalarını içerebilen hassas Intent eşleşme 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ı, kapsanan <data> öğelerinin path*, fragment* ve query* özellikleri tarafından belirtilir.

Eşleştirme

Bir URI'nin eşleşmesi için URI'ye göre her filtre grubu bölümü, URI'nin bir bölümüyle eşleşmelidir. URI'nin, URI'ye göre filtre grubunda belirtilmeyen kısımları olabilir. Örneğin:

<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öre filtre grubu tarafından belirtilen her şey mevcut olduğundan filtre eşleşir. https://project.example.com/any/path/here?param1=value1&param2=value2&param3=value3 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, https://project.example.com/any/path/here?param1=value1 ile eşleşmiyor. https://project.example.com/any/path/here?param1=value1, param2=value2 eksik.

OR ve AND

<data> etiketleri <uri-relative-filter-group> dışında 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, sonraki örnekte /prefix ile başlayıp suffix ile biten yollar eşleştirilir:

<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> içindeki 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>

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

Filtre, hariç tutma kuralı değerlendirilmeden önce bir eşleşme bulunduğu için #fragment parçasıyla eşleşir ancak #fragment123 gibi parçalar 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 olan <data> etiketleri). <uri-relative-filter-group> etiketlerinin düzgün çalışması için kardeş <data> etiketleri olmalıdır. Bunun nedeni, URI özelliklerinin <intent-filter> düzeyinde karşılıklı olarak bağımlı olmasıdır:

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

Bir <intent-filter> öğesinin <data> alt öğeleri, <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, https://project.example.com/path?query değerini kabul eder. Çünkü bu değer, <uri-relative-filter-group> hariç tutma kuralının dışında olan <data android:path="/path" /> ile eşleşir.

Yaygın kullanım alanı

Sorgu parametresinin varlığına veya değerine bağlı olarak https://project.example.com/path URI'sini 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 öğesini engelleyen bir intent filtresi oluşturmak için şuna benzer bir şey 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 yöntem aslında işe yaramaz. https://project.example.com/path?query URI'si /path yoluyla eşleşir ve <uri-relative-filter-group> etiketi eşleşme sırasında ekstra parçalara izin verir.

Intent filtresini aşağıdaki gibi 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ı önce değerlendirildiği için çalışır.

Kodu basitleştirmek için davranışı tersine çevirerek sorgu parametrelerine izin verin ve sorgu parametresi içermeyen URI'leri engelleyin:

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

URI kodlu karakterler içeren URI'lerle eşleşmek 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 ne ?param=value! ile ne de ?param=value%21 ile eşleşiyor.

Öğe sayısı

<uri-relative-filter-group> öğelerinden istediğiniz kadarını <intent-filter> içine yerleştirebilirsiniz.

Ek kaynaklar

Intent filtrelerinin işleyiş şekliyle ilgili bilgi edinmek için (ör. intent nesnelerinin filtrelere göre nasıl eşleştirileceğiyle ilgili kurallar) 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 sayfalarını inceleyin.

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