Чтобы сопоставить входящие экземпляры 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, сохраняет информацию о специализированном совпадении, не требуя непроверенного нисходящего приведения типов:
StaticKeyDeepLinkMatcherсвязываетRсDeepLinkMatcher.MatchResult<T>.UriDeepLinkMatcherсвязываетRсUriMatchResult, сохраняя обработанный путь и аргументы запроса вместе с оценками соответствия шаблону.BackStackMatcherсвязываетRс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) }
Чтобы обработать полученный обратный стек в действии, ознакомьтесь с разделом Сопоставление входящего запроса.