<uri-relative-filter-group>

תחביר:
<uri-relative-filter-group android:allow=["true" | "false"]>
  <data ... />
  ...
</uri-relative-filter-group>
מוכל ב:
<intent-filter>
יכול להכיל:
<data>
תיאור:
יוצר כללי התאמה מדויקים של Intent שיכולים לכלול פרמטרים של שאילתות URI ופרגמנטים של URI. הכללים יכולים להיות כללי הכללה (allow) או כללי אי-הכללה (blocking), בהתאם למאפיין 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 במסנן Intent, המערכת מתעלמת מכל שאר מאפייני ה-URI.
  • אם לא מציינים את host במסנן, המערכת מתעלמת מהמאפיין port ומכל המאפיינים path*.

התגים <data> children של תג <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 בהתאם לנוכחות או לערך של פרמטר שאילתה. כדי ליצור מסנן 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 באופן הבא:

<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! and ?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 למסננים, זמין במאמרים Intents and Intent Filters ו-Intent Filters.

מידע על <uri-relative-filter-group>, אפשר למצוא במאמרים UriRelativeFilterGroup וUriRelativeFilter.

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