כדי למפות מופעים נכנסים של 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), אפשר גם ליצור מסננים באמצעות ביטויי למדה:
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
שימוש בשיטות השוואה שסופקו
הספרייה כוללת שלוש הטמעות רגילות של DeepLinkMatcher:
StaticKeyDeepLinkMatcher, UriDeepLinkMatcher ו-BackStackMatcher. אם התנאים האלה לא מתאימים לדרישות של האפליקציה, אפשר ליצור תנאים מותאמים אישית להתאמת קישורי עומק.
התאמה של קישורי עומק בסיסיים
כדי להתאים בקשות שממלאות את כל המסננים שצוינו לקישורי עומק בסיסיים שאין להם ארגומנטים לחילוץ, משתמשים ב-StaticKeyDeepLinkMatcher.
לדוגמה, כדי לטפל בכוונות של 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) }
כדי לטפל במצבור הפעולות הקודמות שנוצר בפעילות, אפשר לעיין במאמר בנושא התאמה של בקשה נכנסת.