برای نگاشت نمونههای ورودی DeepLinkRequest به کلیدهایی که میتوانند به پشته قبلیهای برنامهتان اضافه شوند، نمونههای 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، اطلاعات مطابقت تخصصی را بدون نیاز به تبدیل نوع پایینرونده علامتنزده حفظ میکند:
StaticKeyDeepLinkMatcherRرا بهDeepLinkMatcher.MatchResult<T>متصل میکند.UriDeepLinkMatcherRرا بهUriMatchResultمتصل میکند، مسیر تجزیهشده و آرگومانهای پُرسمان را در کنار امتیازهای تطبیق الگو حفظ میکند.-
BackStackMatcherRرا بهBackStackMatchResultمتصل میکند، و فهرست پشته قبلیهای مصنوعی ساختهشده توسط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 را ببینید.
ساختن پشته قبلیهای مصنوعی
برای تعریف نحوه ساختن پشته قبلیهای مصنوعی از تطابق موفق، از
BackStackMatcher استفاده کنید. بهجای نمونهسازی مستقیم BackStackMatcher، تابع افزونه withBackStack را در DeepLinkMatcher دیگری فراخوانی کنید. withBackStack گیرنده را در BackStackMatcher
میپوشاند که BackStackMatchResult حاوی پشته قبلیهای مصنوعی
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) }
برای مدیریت پشته قبلیها در فعالیتتان، مطابقت دادن درخواست ورودی را ببینید.