<uri-relative-filter-group>

תחביר:
<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&param2=value2&param3=value3 כי כל הפרטים שצוינו בקבוצת המסננים היחסית של ה-URI נמצאים. הסינון תואם גם ל-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>

כתוצאה מכך, מספר מאפייני 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.

מאפיינים:
android:allow
הקבוצה הזו של מסננים יחסיים ל-URI היא כלל הכללה (הרשאה) ולא כלל החרגה (חסימה). ערך ברירת המחדל הוא "true".
ערך תיאור
"true" (ברירת מחדל) אם קבוצת המסננים היחסית של ה-URI תואמת, גם מסנן ה-Intent תואם
"false" אם קבוצת המסננים היחסית של ה-URI תואמת, מסנן הכוונה לא תואם
הופיע לראשונה:
רמת API 35
מידע נוסף:
<intent-filter>
<data>