Aby zmapować przychodzące instancje DeepLinkRequest na klucze, które można dodać do stosu wstecznego aplikacji, zdefiniuj instancje DeepLinkMatcher.
DeepLinkMatcher to klasa abstrakcyjna, która zawiera 2 metody: match i matchRequest. Podklasy muszą implementować matchRequest, która przyjmuje DeepLinkRequest i zwraca DeepLinkMatcher.MatchResult, jeśli żądanie pasuje, lub null w przeciwnym razie.
Ponieważ do jednego żądania może pasować kilka dopasowań, MatchResult implementuje Comparable, aby oceniać wyniki i wybierać najlepsze dopasowanie.
Parametry typu
Klasa DeepLinkMatcher deklaruje 2 parametry typu ogólnego: DeepLinkMatcher<T : Any, R : DeepLinkMatcher.MatchResult<T>>.
T : Any: typ klucza nawigacyjnego miejsca docelowego (np.UserProfileKeylubNavKey) zwracany, gdy precyzyjny link pasuje do wzorca.R : DeepLinkMatcher.MatchResult<T>: konkretny podtypMatchResultzwracany przezmatchRequestimatch.
Drugi parametr typu, R, zachowuje wyspecjalizowane informacje o dopasowaniu bez konieczności niesprawdzonego rzutowania w dół:
StaticKeyDeepLinkMatcherwiążeRzDeepLinkMatcher.MatchResult<T>.UriDeepLinkMatcherwiążeRzUriMatchResult, zachowując przeanalizowaną ścieżkę i argumenty zapytania wraz z wynikami dopasowania wzorca.BackStackMatcherwiążeRzBackStackMatchResult, zachowując syntetyczną listę stosu wstecznego utworzoną przezwithBackStack.
Żądania filtrowania wstępnego
Implementacje DeepLinkMatcher mogą określać listę instancji DeepLinkMatcher.Filter, aby filtrować żądania przed ich oceną.
Biblioteka zawiera funkcje pomocnicze do tworzenia typowych filtrów:
DeepLinkMatcher.mimeTypeFilter: dopasowuje według dokładnych ciągów znakówmimeType(sprawdzaMimeTypeExtrasKey).DeepLinkMatcher.actionFilter: dopasowuje dokładnie ciągi znakówaction(sprawdzaActionExtrasKey).
Dzięki temu możesz używać tego samego wzorca identyfikatora URI do różnych działań, takich jak wyświetlanie i edytowanie:
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))
Ponieważ Filter jest interfejsem funkcjonalnym (SAM), możesz też tworzyć filtry za pomocą wyrażeń lambda:
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
Korzystanie z udostępnionych dopasowań
Biblioteka zawiera 3 standardowe implementacje DeepLinkMatcher: StaticKeyDeepLinkMatcher, UriDeepLinkMatcher i BackStackMatcher. Jeśli te dopasowania nie spełniają wymagań Twojej aplikacji, możesz utworzyć niestandardowe dopasowania precyzyjnych linków.
Dopasowywanie podstawowych precyzyjnych linków
W przypadku podstawowych precyzyjnych linków, które nie mają argumentów do wyodrębnienia, użyj StaticKeyDeepLinkMatcher, aby dopasować żądania, które spełniają wszystkie podane filtry.
Na przykład, aby obsługiwać intencje dla ACTION_APPLICATION_PREFERENCES:
val preferencesActionFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_APPLICATION_PREFERENCES) val preferencesActionDeepLinkMatcher = StaticKeyDeepLinkMatcher(PreferencesScreen, listOf(preferencesActionFilter))
Dopasowywanie precyzyjnych linków do identyfikatorów URI
Do dopasowywania hierarchicznych identyfikatorów URI do wzorców i wyodrębniania argumentów używaj UriDeepLinkMatcher. Możesz na przykład dopasować www.example.com/users/{id}, aby wyodrębnić argument id do klucza docelowego. Więcej informacji znajdziesz w artykule Dopasowywanie precyzyjnych linków URI.
Tworzenie syntetycznego stosu wstecznego
Aby określić, jak utworzyć syntetyczny stos wsteczny z dopasowania, użyj BackStackMatcher. Zamiast bezpośrednio tworzyć instancję BackStackMatcher, wywołaj funkcję rozszerzenia withBackStack w innym DeepLinkMatcher. withBackStack opakowuje odbiornik w BackStackMatcher, który zwraca BackStackMatchResult zawierający syntetyczny stos wsteczny List. Ponieważ BackStackMatchResult przekazuje porównanie do wyniku dopasowania, opakowanie dopasowania w withBackStack zachowuje jego pierwotny ranking dopasowania.
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) }
Aby obsłużyć wynikowy stos wsteczny w aktywności, zapoznaj się z sekcją Dopasowywanie przychodzącego żądania.