<uri-relative-filter-group>

सिंटैक्स:
<uri-relative-filter-group android:allow=["true" | "false"]>
  <data ... />
  ...
</uri-relative-filter-group>
इनमें शामिल है:
<intent-filter>
इसमें ये चीज़ें शामिल हो सकती हैं:
<data>
जानकारी:
मैच करने के सटीक 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

<uri-relative-filter-group> के बाहर मौजूद <data> टैग के लिए OR का इस्तेमाल किया जाता है, जबकि <uri-relative-filter-group> के अंदर मौजूद <data> टैग के लिए 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* एट्रिब्यूट को अनदेखा कर दिया जाता है.

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

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

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

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