Для сопоставления входящих экземпляров 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) }
Для обработки образовавшегося стека ошибок в вашем действии см. раздел «Сопоставление входящего запроса» .