Создавайте пользовательские классы DeepLinkMatcher

Если предоставленных сопоставителей недостаточно для ваших задач, вы можете создать свои собственные, расширив класс DeepLinkMatcher .

При расширении DeepLinkMatcher<T, R> необходимо указать два аргумента типа: тип ключа навигации назначения ( T : Any ) и тип результата сопоставления ( R : DeepLinkMatcher.MatchResult<T> ). Если вашему сопоставителю не требуется пользовательское ранжирование результатов или дополнительные метаданные, используйте DeepLinkMatcher.MatchResult<T> в качестве второго аргумента типа.

Например, вот базовая реализация TelDeepLinkMatcher , которая поддерживает URI tel (например, tel:5550100 ). Поскольку URI tel являются непрозрачными, UriDeepLinkMatcher их не поддерживает:

Классы Rank custom MatchResult

Если существует эффективный способ сравнения результатов поиска, полученных с помощью вашего пользовательского сопоставителя, вам следует расширить класс DeepLinkMatcher.MatchResult и переопределить метод compareTo для ранжирования результатов.

При создании пользовательского подкласса MatchResult обновите объявление класса вашего сопоставителя, указав этот подкласс в качестве второго параметра типа R (например, class TelDeepLinkMatcher : DeepLinkMatcher<DialerKey, TelMatchResult>() ). Это позволит вызывающим абонентам получать доступ к вашим пользовательским свойствам результата без неконтролируемого приведения типов.

Например, для поддержки сопоставления с использованием подстановочных символов в TelDeepLinkMatcher можно реализовать TelMatchResult , чтобы гарантировать, что точные совпадения будут иметь более высокий приоритет, чем совпадения с использованием подстановочных символов. Если сопоставитель обернут в withBackStack , распакуйте WrappedMatchResult перед сравнением, чтобы приоритет оценивался относительно базового результата сопоставления: