<uri-relative-filter-group>

البنية:
<uri-relative-filter-group android:allow=["true" | "false"]>
  <data ... />
  ...
</uri-relative-filter-group>
المحتوى المضمّن في:
<intent-filter>
يمكن أن تحتوي على ما يلي:
<data>
description:
إنشاء قواعد مطابقة Intent دقيقة يمكن أن تتضمّن مَعلمات طلب البحث الخاصة بمعرّف الموارد المنتظم (URI) وأجزاء معرّف الموارد المنتظم (URI) يمكن أن تكون القواعد قواعد تضمين (السماح) أو استبعاد (الحظر) ، وذلك استنادًا إلى سمة android:allow. يتم تحديد القواعد المطابقة من خلال سمات path* و fragment* و query* للعناصر المضمّنة <data>.

المطابقة

لمطابقة معرّف موارد منتظم، يجب أن يتطابق كل جزء من مجموعة الفلتر المرتبط بمعرّف الموارد المنتظم مع جزء من معرّف الموارد المنتظم. يمكن أن تكون هناك أجزاء من معرّف الموارد المنتظم لم يتم تحديدها في مجموعة الفلاتر النسبية لمعرّف الموارد المنتظم. مثلاً:

<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 لأنّ كل العناصر المحدّدة من خلال مجموعة الفلتر النسبية لمعرّف الموارد المنتظم متوفّرة. يتطابق الفلتر أيضًا مع https://project.example.com/any/path/here?param2=value2&param1=value1 لأنّ ترتيب مَعلمات طلب البحث لا يهمّ. ومع ذلك، لا يتطابق الفلتر مع https://project.example.com/any/path/here?param1=value1، الذي لا يتضمّن param2=value2.

OR وAND

يتمّ استخدام علامة OR مع علامات <data> خارج <uri-relative-filter-group> ، بينما يتمّ استخدام علامة AND مع علامات <data> داخل <uri-relative-filter-group>.

راجِع المثال التالي:

<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> لكي تعمل بشكل صحيح لأنّ سمات عنوان URL تتعلّق ببعضها البعض على مستوى <intent-filter>:

  • إذا لم يتم تحديد قيمة لسمة scheme في فلتر الأهداف، يتم تجاهل جميع سمات عناوين URL الأخرى.
  • إذا لم يتم تحديد قيمة 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>.

حالة الاستخدام الشائعة

تخيل أنّ لديك عنوان URL هو 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>

في الواقع، لا يعمل هذا الإجراء. يطابق عنوان URI https://project.example.com/path?query المسار /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>

يعمل هذا الفلتر لأنّه يتم أولاً تقييم قواعد الحظر التي تحظر مَعلمات الاستعلام غير الفارغة.

لتبسيط الرمز، يمكنك عكس السلوك للسماح بمَعلمات طلب البحث وحظر عناوين URL بدون مَعلمات طلب البحث:

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

لمطابقة معرّفات الموارد المنتظمة التي تحتوي على أحرف مُشفَّرة، اكتب الأحرف الأولية غير المشفَّرة في الفلتر، على سبيل المثال:

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

مراجع إضافية

للحصول على معلومات عن آلية عمل فلاتر الأهداف، بما في ذلك قواعد كيفية مطابقة ملفّات تعريف الأهداف مع الفلاتر، يُرجى الاطّلاع على الأهداف وفلاتر الأهداف و فلاتر الأهداف.

للحصول على معلومات عن <uri-relative-filter-group>، يُرجى الاطّلاع على UriRelativeFilterGroup و UriRelativeFilter.

السمات:
android:allow
ما إذا كانت مجموعة الفلاتر النسبية لمعرّف الموارد المنتظم هذه هي قاعدة تضمين (سماح) بدلاً من استبعاد (حظر) تكون القيمة التلقائية "true".
القيمة الوصف
"true" (تلقائي) في حال تطابق مجموعة الفلاتر النسبية لمعرّف الموارد المنتظم، يتطابق فلتر الأهداف
"false" إذا تطابقت مجموعة الفلتر النسبي لعنوان URL، لن يتطابق فلتر الأهداف.
تمّت إتاحة هذه الميزة لأول مرة في:
المستوى 35 من واجهة برمجة التطبيقات
راجِع أيضًا:
<intent-filter>
<data>