כדי למפות מופעים נכנסים של DeepLinkRequest למפתחות שאפשר להוסיף למקבץ הפעילויות הקודמות (back stack) של האפליקציה, מגדירים מופעים של DeepLinkMatcher.
DeepLinkMatcher היא מחלקה מופשטת שכוללת שתי שיטות, match ו-matchRequest. מחלקות משנה צריכות להטמיע את matchRequest, שמקבל DeepLinkRequest ומחזיר DeepLinkMatcher.MatchResult אם הבקשה תואמת, או null אחרת.
יכול להיות שכמה התאמות יתאימו לבקשה אחת, ולכן MatchResult מטמיע את Comparable כדי לדרג את התוצאות ולבחור את ההתאמה הכי טובה.
פרמטרים של סוגים
המחלקה DeepLinkMatcher מצהירה על שני פרמטרים מסוג גנרי:
DeepLinkMatcher<T : Any, R : DeepLinkMatcher.MatchResult<T>>.
-
T : Any: סוג מפתח הניווט של היעד (למשלUserProfileKeyאוNavKey) שמוחזר כשיש התאמה לקישור העומק. -
R : DeepLinkMatcher.MatchResult<T>: סוג המשנה הספציפי שלMatchResultשמוחזר על ידיmatchRequestו-match.
הפרמטר מהסוג השני, R, שומר על מידע מיוחד לגבי ההתאמה בלי לדרוש המרה לא מבוקרת לסוג נתונים ספציפי יותר:
-
StaticKeyDeepLinkMatcherמקשר אתRאלDeepLinkMatcher.MatchResult<T>. -
UriDeepLinkMatcherמקשר אתRאלUriMatchResult, ושומר את הארגומנטים של הנתיב והשאילתה שנותחו לצד הציונים של התאמת התבניות. -
BackStackMatcherמקשר אתRאלBackStackMatchResult, ושומר על רשימת מקבץ הפעילויות הקודמות (back stack) הסינתטית שנוצרה על ידיwithBackStack.
בקשות לסינון מקדים
הטמעות של DeepLinkMatcher יכולות לציין רשימה של מופעי DeepLinkMatcher.Filter כדי לסנן בקשות לפני שהן נבדקות.
הספרייה כוללת פונקציות עזר ליצירת מסננים נפוצים:
-
DeepLinkMatcher.mimeTypeFilter: התאמות לפי מחרוזותmimeTypeמדויקות (בודק אתMimeTypeExtrasKey). -
DeepLinkMatcher.actionFilter: התאמה לפי מחרוזותactionמדויקות (בודק אתActionExtrasKey).
הגישה הזו מאפשרת לכם להשתמש שוב באותה תבנית URI לפעולות שונות, כמו צפייה לעומת עריכה:
val viewFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_VIEW) val editFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_EDIT) val imageUriPattern = DeepLinkUri("www.example.com/image/{id}") val viewMatcher = UriDeepLinkMatcher(imageUriPattern, serializer<Gallery>(), filters = listOf(viewFilter)) val editMatcher = UriDeepLinkMatcher(imageUriPattern, serializer<Editor>(), filters = listOf(editFilter))
מכיוון ש-Filter הוא ממשק פונקציונלי (SAM), אפשר גם ליצור מסננים באמצעות ביטויי lambda:
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
שימוש בהתאמות שסופקו
הספרייה כוללת שלוש הטמעות סטנדרטיות של DeepLinkMatcher:
StaticKeyDeepLinkMatcher, UriDeepLinkMatcher ו-BackStackMatcher. אם ההתאמות האלה לא עומדות בדרישות של האפליקציה, אתם יכולים ליצור התאמות בהתאמה אישית לקישורי עומק.
התאמה של קישורי עומק בסיסיים
בקישורי עומק בסיסיים שאין בהם ארגומנטים לחילוץ, משתמשים ב-StaticKeyDeepLinkMatcher כדי להתאים לבקשות שעומדות בכל המסננים שסופקו.
לדוגמה, כדי לטפל ב-Intent של ACTION_APPLICATION_PREFERENCES:
val preferencesActionFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_APPLICATION_PREFERENCES) val preferencesActionDeepLinkMatcher = StaticKeyDeepLinkMatcher(PreferencesScreen, listOf(preferencesActionFilter))
התאמת קישורי עומק של URI
כדי להתאים בין מזהי URI היררכיים לתבניות ולחלץ ארגומנטים, משתמשים ב-UriDeepLinkMatcher. לדוגמה, אפשר להתאים את www.example.com/users/{id} כדי לחלץ את הארגומנט id למפתח יעד. מידע נוסף זמין במאמר התאמת קישורי עומק של URI.
יצירת מקבץ פעילויות קודמות (back stack) סינתטי
כדי להגדיר איך ליצור מקבץ פעילויות קודמות (back stack) סינתטי מהתאמה מוצלחת, משתמשים ב-BackStackMatcher. במקום ליצור מופע של BackStackMatcher באופן ישיר, צריך להפעיל את פונקציית התוסף withBackStack ב-DeepLinkMatcher אחר. withBackStack עוטף את המקלט ב-BackStackMatcher שמחזיר BackStackMatchResult שמכיל מקבץ פעילויות קודמות (back stack) סינתטי List. מכיוון ש-BackStackMatchResult מעביר את ההשוואה לתוצאת ההתאמה הבסיסית, עטיפת התאמה ב-withBackStack שומרת על דירוג ההתאמה המקורי שלה.
val homeMatcher = StaticKeyDeepLinkMatcher(HomeKey, listOf(DeepLinkMatcher.actionFilter(Intent.ACTION_VIEW))) val userListMatcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/users?page={page}"), serializer<UserListKey>() ).withBackStack { matchResult -> listOf(HomeKey, matchResult.key) } val userProfileMatcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/users/{id}"), serializer<UserProfileKey>() ).withBackStack { matchResult -> listOf(HomeKey, UserListKey(), matchResult.key) }
כדי לטפל במקבץ הפעילויות הקודמות שנוצר בפעילות שלכם, עיינו בקטע התאמה לבקשה נכנסת.