<uri-relative-filter-group>

نحو:
<uri-relative-filter-group android:allow=["true" | "false"]>
  <data ... />
  ...
</uri-relative-filter-group>
موجود در:
<intent-filter>
می تواند شامل:
<data>
توضیحات:
قوانین تطبیق دقیق Intent را ایجاد می کند که می تواند شامل پارامترهای کوئری URI و قطعات URI باشد. بسته به ویژگی android: allow ، قوانین می‌توانند شامل قوانین گنجاندن ( اجازه ) یا قوانین حذف ( مسدود کردن ) باشند. قوانین تطبیق با ویژگی های path* ، fragment* و query* عناصر <data> موجود مشخص می شوند.

تطبیق

برای مطابقت با یک URI، هر بخش از گروه فیلتر نسبی URI باید با بخشی از URI مطابقت داشته باشد. ممکن است بخش هایی از URI وجود داشته باشد که در گروه فیلتر نسبی URI مشخص نشده باشد. به عنوان مثال:

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

فیلتر با https://project.example.com/any/path/here?param1=value1&param2=value2&param3=value3 مطابقت دارد زیرا هر چیزی که توسط گروه فیلتر نسبی URI مشخص شده وجود دارد. فیلتر همچنین با https://project.example.com/any/path/here?param2=value2&param1=value1 مطابقت دارد زیرا ترتیب پارامترهای پرس و جو مهم نیست. با این حال، فیلتر با https://project.example.com/any/path/here?param1=value1 مطابقت ندارد، که param2=value2 وجود ندارد.

OR و AND

تگ های <data> خارج از <uri-relative-filter-group> OR شده اند، در حالی که تگ های <data> داخل <uri-relative-filter-group> AND می شوند.

به مثال زیر توجه کنید:

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

این فیلتر مسیرهایی را که با /prefix شروع می شوند یا با suffix ختم می شوند مطابقت می دهد.

در مقابل، مثال بعدی مسیرهایی را که با /prefix شروع می‌شوند و با 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>

در نتیجه، چندین ویژگی path در یک <uri-relative-filter-group> با هیچ چیزی مطابقت ندارند:

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

دستور اظهارنامه

به مثال زیر توجه کنید:

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

فیلتر با قطعه #fragment قطع مطابقت دارد زیرا قبل از ارزیابی قانون حذف، یک تطابق پیدا می‌شود، اما قطعاتی مانند #fragment123 مطابقت ندارند.

تگ های خواهر و برادر

تگ‌های <uri-relative-filter-group> با تگ‌های <data> برادر خود کار می‌کنند (یعنی تگ‌های <data> که خارج از <uri-relative-filter-group> هستند اما در داخل همان <intent-filter> هستند. ). تگ‌های <uri-relative-filter-group> باید دارای تگ‌های <data> باشند تا به درستی کار کنند، زیرا ویژگی‌های URI در سطح <intent-filter> به یکدیگر وابسته هستند:

  • اگر scheme برای فیلتر intent مشخص نشده باشد، تمام ویژگی های URI دیگر نادیده گرفته می شوند.
  • اگر host برای فیلتر مشخص نشده باشد، ویژگی port و تمام ویژگی‌های path* نادیده گرفته می‌شوند.

فرزندان <data> یک <intent-filter> قبل از هر تگ <uri-relative-filter-group> ارزیابی می شوند. سپس تگ های <uri-relative-filter-group> به ترتیب ارزیابی می شوند، برای مثال:

<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 را می‌پذیرد زیرا با <data android:path="/path" /> مطابقت دارد، که خارج از قانون طرد <uri-relative-filter-group> است.

مورد استفاده رایج

تصور کنید URI https://project.example.com/path دارید که می‌خواهید بسته به وجود یا مقدار یک پارامتر کوئری، آن را با یک Intent مطابقت دهید. برای ایجاد یک فیلتر هدف که با https://project.example.com/path مطابقت داشته باشد و https://project.example.com/path?query را مسدود کند، ممکن است چیزی شبیه به این را امتحان کنید:

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

این، در واقع، کار نمی کند. https://project.example.com/path?query URI با مسیر /path مطابقت دارد و تگ <uri-relative-filter-group> در صورت تطبیق قطعات اضافی را امکان پذیر می کند.

فیلتر قصد را به صورت زیر اصلاح کنید:

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

این فیلتر به این دلیل کار می کند که ابتدا قوانین مسدودسازی که پارامترهای پرس و جو غیر خالی را ممنوع می کنند، ارزیابی می شوند.

برای ساده کردن کد، رفتار را برگردانید تا پارامترهای پرس و جو اجازه داده شود و URI ها بدون پارامترهای پرس و جو مسدود شوند:

<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

برای مطابقت با URI هایی که دارای نویسه های رمزگذاری شده با URI هستند، نویسه های خام و رمزگذاری نشده را در فیلتر بنویسید، به عنوان مثال:

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

فیلتر با ?param=value! و ?param=value%21 .

با این حال، اگر کاراکترهای کدگذاری شده را در فیلتر به صورت زیر بنویسید:

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

فیلتر هیچ کدام با ?param=value! و نه ?param=value%21 .

تعداد عناصر

می توانید هر تعداد عنصر <uri-relative-filter-group> را در داخل <intent-filter> قرار دهید.

منابع اضافی

برای اطلاعات در مورد نحوه عملکرد فیلترهای هدف، از جمله قوانین مربوط به نحوه تطبیق اشیاء قصد با فیلترها، به Intent ها و Intent Filters و Intent Filters مراجعه کنید.

برای اطلاعات در مورد <uri-relative-filter-group> ، به UriRelativeFilterGroup و UriRelativeFilter مراجعه کنید.

صفات:
android:allow
این که آیا این گروه فیلتر نسبی URI یک قانون شامل ( اجازه ) است یا نه یک قانون حذف ( مسدود کننده ). مقدار پیش فرض "true" است.
ارزش توضیحات
"true" (پیش فرض) اگر گروه فیلتر نسبی URI مطابقت داشته باشد، فیلتر قصد مطابقت دارد
"false" اگر گروه فیلتر نسبی URI مطابقت داشته باشد، فیلتر قصد مطابقت ندارد
معرفی شده در:
سطح API 35
همچنین ببینید:
<intent-filter>
<data>