<uri-relative-filter-group>

सिंटैक्स:
<uri-relative-filter-group android:allow=["true" | "false"]>
  <data ... />
  ...
</uri-relative-filter-group>
इसमें शामिल:
<intent-filter>
इसमें ये शामिल हो सकते हैं:
<data>
description:
इससे सटीक Intent मैच करने के नियम बनाए जा सकते हैं. इनमें यूआरआई क्वेरी पैरामीटर और यूआरआई फ़्रैगमेंट शामिल हो सकते हैं. android:allow एट्रिब्यूट के आधार पर, नियम शामिल करने (अनुमति देने) या बाहर रखने (ब्लॉक करने) वाले हो सकते हैं. मैच करने के नियम, शामिल किए गए <data> एलिमेंट के path*, fragment*, और query* एट्रिब्यूट से तय किए जाते हैं.

मैच करना

किसी यूआरआई को मैच करने के लिए, यूआरआई के रिलेटिव फ़िल्टर ग्रुप के हर हिस्से का, यूआरआई के किसी हिस्से से मैच होना ज़रूरी है. यूआरआई के ऐसे हिस्से हो सकते हैं जो यूआरआई के रिलेटिव फ़िल्टर ग्रुप में तय नहीं किए गए हैं. उदाहरण के लिए:

<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> टैग का होना ज़रूरी है, क्योंकि यूआरआई एट्रिब्यूट, <intent-filter> लेवल पर एक-दूसरे पर निर्भर होते हैं:

  • अगर इंटेंट फ़िल्टर के लिए कोई scheme तय नहीं किया गया है, तो यूआरआई के अन्य सभी एट्रिब्यूट को अनदेखा कर दिया जाता है.
  • अगर फ़िल्टर के लिए कोई host तय नहीं किया गया है, तो port एट्रिब्यूट और सभी path* एट्रिब्यूट को अनदेखा कर दिया जाता है.

किसी भी <uri-relative-filter-group> टैग का आकलन करने से पहले, <intent-filter> के <data> चाइल्ड टैग का आकलन किया जाता है. इसके बाद, <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> के बाहर रखने के नियम में शामिल नहीं है.

इस्तेमाल का सामान्य उदाहरण

मान लें कि आपके पास यूआरआई 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 यूआरआई पाथ /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>

यह फ़िल्टर काम करता है, क्योंकि खाली न होने वाले क्वेरी पैरामीटर को ब्लॉक करने वाले नियमों का आकलन पहले किया जाता है.

कोड को आसान बनाने के लिए, क्वेरी पैरामीटर की अनुमति देने और क्वेरी पैरामीटर के बिना यूआरआई को ब्लॉक करने के लिए, व्यवहार को बदलें:

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

यूआरआई-एनकोडेड वर्ण

यूआरआई-एनकोडेड वर्णों वाले यूआरआई को मैच करने के लिए, फ़िल्टर में रॉ, अनएनकोडेड वर्ण लिखें उदाहरण के लिए:

<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 से मैच करता है.

एलिमेंट की संख्या

किसी <intent-filter> में, <uri-relative-filter-group> के किसी भी एलिमेंट को जोड़ा जा सकता है.

दूसरे संसाधन

इंटेंट फ़िल्टर के काम करने के तरीके के बारे में जानने के लिए, इंटेंट ऑब्जेक्ट को फ़िल्टर से मैच करने के नियमों के बारे में जानने के लिए, इंटेंट और इंटेंट फ़िल्टर और इंटेंट फ़िल्टर लेख पढ़ें.

<uri-relative-filter-group> के बारे में जानने के लिए, UriRelativeFilterGroup और UriRelativeFilter लेख पढ़ें.

attributes:
android:allow
यह यूआरआई रिलेटिव फ़िल्टर ग्रुप, बाहर रखने (ब्लॉक करने) के बजाय, शामिल करने (अनुमति देने) का नियम है या नहीं. डिफ़ॉल्ट वैल्यू "true" है.
वैल्यू ब्यौरा
"true" (डिफ़ॉल्ट) अगर यूआरआई रिलेटिव फ़िल्टर ग्रुप मैच करता है, तो इंटेंट फ़िल्टर मैच करता है
"false" अगर यूआरआई रिलेटिव फ़िल्टर ग्रुप मैच करता है, तो इंटेंट फ़िल्टर मैच नहीं करता
पहली बार इसमें दिखाया गया:
एपीआई लेवल 35
यह भी देखें:
<intent-filter>
<data>