- نحو:
<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¶m2=value2¶m3=value3
مطابقت دارد زیرا هر چیزی که توسط گروه فیلتر نسبی URI مشخص شده وجود دارد. فیلتر همچنین باhttps://project.example.com/any/path/here?param2=value2¶m1=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>
- نحو:
<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¶m2=value2¶m3=value3
مطابقت دارد زیرا هر چیزی که توسط گروه فیلتر نسبی URI مشخص شده وجود دارد. فیلتر همچنین باhttps://project.example.com/any/path/here?param2=value2¶m1=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>