- תחביר:
-
<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, כל חלק בקבוצת המסננים היחסית של ה-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
במסנן הכוונה, המערכת מתעלמת מכל שאר מאפייני ה-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>
למעשה, זה לא עובד. ה-URI
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>
המסנן הזה פועל כי כללי החסימה שאוסרים על פרמטרים של שאילתות ריקים נבדקים קודם.
כדי לפשט את הקוד, משנים את ההתנהגות כך שתאפשר להשתמש בפרמטרים של שאילתות ותחסום URIs ללא פרמטרים של שאילתות:
<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>
.משאבים נוספים
מידע נוסף על אופן הפעולה של מסנני הכוונה, כולל הכללים שלפיהם מתבצע ההתאמה של אובייקטי הכוונה למסננים, זמין במאמרים כוונות ומסנני כוונה ומסנני כוונה.
מידע על
<uri-relative-filter-group>
זמין במאמריםUriRelativeFilterGroup
ו-UriRelativeFilter
. - אם לא מציינים את הערך
- מאפיינים:
- הופיע לראשונה:
- רמת API 35
- מידע נוסף:
-
<intent-filter>
<data>
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2024-12-21 (שעון UTC).
[[["התוכן קל להבנה","easyToUnderstand","thumb-up"],["התוכן עזר לי לפתור בעיה","solvedMyProblem","thumb-up"],["סיבה אחרת","otherUp","thumb-up"]],[["חסרים לי מידע או פרטים","missingTheInformationINeed","thumb-down"],["התוכן מורכב מדי או עם יותר מדי שלבים","tooComplicatedTooManySteps","thumb-down"],["התוכן לא עדכני","outOfDate","thumb-down"],["בעיה בתרגום","translationIssue","thumb-down"],["בעיה בדוגמאות/בקוד","samplesCodeIssue","thumb-down"],["סיבה אחרת","otherDown","thumb-down"]],["עדכון אחרון: 2024-12-21 (שעון UTC)."],[],[]]