<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> المضمّنة.

المطابقة

لمطابقة معرّف موارد منتظم (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 لأنّ كل ما تم تحديده بواسطة مجموعة الفلاتر النسبية لمعرّف الموارد المنتظم متوفّر. يتطابق الفلتر أيضًا مع 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>

نتيجةً لذلك، لن تطابق السمات المتعدّدة في <uri-relative-filter-group> نفسها أي شيء:path

<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 لفلتر الأهداف، سيتم تجاهل جميع سمات معرّف الموارد المنتظم الأخرى.
  • إذا لم يتم تحديد 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 استنادًا إلى توفّر مَعلمة طلب بحث أو قيمتها. لإنشاء intent filter يطابق 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 على النحو التالي:

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

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

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