- 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 atributandroid:allow
. Aturan pencocokan ditentukan oleh atributpath*
,fragment*
, danquery*
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¶m2=value2¶m3=value3
karena semua yang ditentukan oleh grup filter relatif URI ada. Filter juga cocok denganhttps://project.example.com/any/path/here?param2=value2¶m1=value1
karena urutan parameter kueri tidak penting. Namun, filter tidak cocok denganhttps://project.example.com/any/path/here?param1=value1
, yang tidak memilikiparam2=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 dengansuffix
.Sebaliknya, contoh berikutnya cocok dengan jalur yang dimulai dengan
/prefix
DAN diakhiri dengansuffix
:<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, atributport
dan semua atributpath*
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 denganIntent
, bergantung pada keberadaan atau nilai parameter kueri. Untuk membuat filter intent yang cocok denganhttps://project.example.com/path
dan memblokirhttps://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>
, lihatUriRelativeFilterGroup
danUriRelativeFilter
. - Jika
- 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>
Konten dan contoh kode di halaman ini tunduk kepada lisensi yang dijelaskan dalam Lisensi Konten. Java dan OpenJDK adalah merek dagang atau merek dagang terdaftar dari Oracle dan/atau afiliasinya.
Terakhir diperbarui pada 2024-12-21 UTC.
[null,null,["Terakhir diperbarui pada 2024-12-21 UTC."],[],[]]