- نحو:
<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?queryURI با مسیر/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?queryURI با مسیر/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>