برای نگاشت نمونههای ورودی 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را بررسی میکند).
این رویکرد به شما امکان میدهد الگوی نشانی وب یکسانی را برای کنشهای مختلف، مانند مشاهده در مقابل ویرایش، استفاده مجدد کنید:
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))
مطابقت پیوندهای عمیق نشانی وب
برای مطابقت دادن نشانیهای وب سلسلهمراتبی با الگوها و استخراج آرگومانها، از
UriDeepLinkMatcher استفاده کنید. برای مثال، میتوانید www.example.com/users/{id} را مطابقت دهید تا
آرگومان id را در کلید مقصد استخراج کنید. برای اطلاعات بیشتر، به
مطابقت پیوندهای عمیق نشانی وب مراجعه کنید.
ساختن پشته برگشت مصنوعی
برای تعریف نحوه ساختن پشته برگشت مصنوعی از مطابقت موفق، از
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) }
برای مدیریت پشته برگشت حاصل در فعالیتتان، به مطابقت دادن درخواست ورودی مراجعه کنید.