<uri-relative-filter-group>

sintaksis:
<uri-relative-filter-group android:allow=["true" | "false"]>
  <data ... />
  ...
</uri-relative-filter-group>
terdapat dalam:
<intent-filter>
dapat berisi:
<data>
deskripsi:
Membuat aturan pencocokan Intent yang akurat yang dapat menyertakan parameter kueri URI dan fragmen URI. Aturan dapat berupa aturan penyertaan (izinkan) atau aturan pengecualian (blokir), bergantung pada atribut android:allow. Aturan pencocokan ditentukan oleh atribut path*, fragment*, dan query* dari elemen <data> yang dimuat.

Pencocokan

Untuk mencocokkan URI, setiap bagian dari grup filter relatif URI harus cocok dengan bagian URI. Mungkin ada bagian URI yang tidak ditentukan dalam grup filter relatif URI. Contoh:

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

Filter cocok dengan https://project.example.com/any/path/here?param1=value1&param2=value2&param3=value3 karena semua yang ditentukan oleh grup filter relatif URI ada. Filter juga cocok dengan https://project.example.com/any/path/here?param2=value2&param1=value1 karena urutan parameter kueri tidak penting. Namun, filter tidak cocok dengan https://project.example.com/any/path/here?param1=value1, yang tidak memiliki param2=value2.

OR dan AND

Tag <data> di luar <uri-relative-filter-group> digabungkan dengan OR, sedangkan tag <data> di dalam <uri-relative-filter-group> digabungkan dengan AND.

Perhatikan contoh berikut:

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

Filter mencocokkan jalur yang diawali dengan /prefix ATAU diakhiri dengan suffix.

Sebaliknya, contoh berikutnya cocok dengan jalur yang dimulai dengan /prefix DAN diakhiri dengan suffix:

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

Akibatnya, beberapa atribut path dalam <uri-relative-filter-group> yang sama tidak cocok dengan apa pun:

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

Urutan deklarasi

Perhatikan contoh berikut:

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

Filter cocok dengan fragmen #fragment karena kecocokan ditemukan sebelum aturan pengecualian dievaluasi, tetapi fragmen seperti #fragment123 tidak cocok.

Tag yang terkait

Tag <uri-relative-filter-group> berfungsi bersama dengan tag <data> saudaranya (yaitu, tag <data> yang berada di luar <uri-relative-filter-group>, tetapi di dalam <intent-filter> yang sama). Tag <uri-relative-filter-group> harus memiliki tag <data> saudara agar berfungsi dengan baik karena atribut URI saling bergantung pada tingkat <intent-filter>:

  • Jika scheme tidak ditentukan untuk filter intent, semua atribut URI lainnya akan diabaikan.
  • Jika host tidak ditentukan untuk filter, atribut port dan semua atribut path* akan diabaikan.

Turunan <data> dari <intent-filter> dievaluasi sebelum tag <uri-relative-filter-group>. Kemudian, tag <uri-relative-filter-group> dievaluasi secara berurutan, misalnya:

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

Filter menerima https://project.example.com/path?query karena cocok dengan <data android:path="/path" />, yang berada di luar aturan pengecualian <uri-relative-filter-group>.

Kasus penggunaan umum

Bayangkan Anda memiliki URI https://project.example.com/path, yang ingin Anda cocokkan dengan Intent, bergantung pada keberadaan atau nilai parameter kueri. Untuk membuat filter intent yang cocok dengan https://project.example.com/path dan memblokir https://project.example.com/path?query, Anda dapat mencoba sesuatu seperti:

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

Nyatanya, hal ini tidak berhasil. URI https://project.example.com/path?query cocok dengan jalur /path, dan tag <uri-relative-filter-group> memungkinkan bagian tambahan saat cocok.

Revisi filter intent sebagai berikut:

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

Filter ini berfungsi karena aturan pemblokiran yang melarang parameter kueri yang tidak kosong dievaluasi terlebih dahulu.

Untuk menyederhanakan kode, balik perilaku untuk mengizinkan parameter kueri dan memblokir URI tanpa parameter kueri:

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

Karakter yang dienkode URI

Untuk mencocokkan URI yang berisi karakter yang dienkode URI, tulis karakter mentah yang tidak dienkode dalam filter, misalnya:

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

Filter cocok dengan ?param=value! dan ?param=value%21.

Namun, jika Anda menulis karakter yang dienkode dalam filter sebagai berikut:

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

Filter tidak cocok dengan ?param=value! atau ?param=value%21.

Jumlah elemen

Anda dapat menempatkan berapa pun elemen <uri-relative-filter-group> di dalam <intent-filter>.

Referensi lainnya

Untuk mengetahui informasi cara kerja filter intent, termasuk aturan cara objek intent dicocokkan dengan filter, lihat Intent dan Filter Intent serta Filter Intent.

Untuk informasi tentang <uri-relative-filter-group>, lihat UriRelativeFilterGroup dan UriRelativeFilter.

atribut:
android:allow
Apakah grup filter relatif URI ini adalah aturan penyertaan (izinkan) dan bukan aturan pengecualian (pemblokiran). Nilai defaultnya adalah "true".
Nilai Deskripsi
"true" (default) Jika grup filter relatif URI cocok, filter intent akan cocok
"false" Jika grup filter relatif URI cocok, filter intent tidak cocok
diperkenalkan di:
API level 35
lihat juga:
<intent-filter>
<data>