Aby zmapować przychodzące DeepLinkRequest instancje na klucze, które można dodać do
stosu wstecz aplikacji, zdefiniuj DeepLinkMatcher instancje.
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ć wiele 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 nawigacji docelowej (np.UserProfileKeylubNavKey) zwracany, gdy precyzyjny link pasuje.R : DeepLinkMatcher.MatchResult<T>: konkretny podtypMatchResultzwracany przezmatchRequestimatch.
Drugi parametr typu, R, zachowuje specjalistyczne informacje o dopasowaniu bez konieczności sprawdzania rzutowania w dół:
StaticKeyDeepLinkMatcherwiążeRzDeepLinkMatcher.MatchResult<T>.UriDeepLinkMatcherwiążeRzUriMatchResult, zachowując przeanalizowane argumenty ścieżki i zapytania wraz z wynikami dopasowania wzorca.BackStackMatcherwiążeRzBackStackMatchResult, zachowując syntetyczną listę stosu wstecz utworzoną przezwithBackStack.
Wstępne filtrowanie żądań
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 dokładnemimeTypeciągi (sprawdzaMimeTypeExtrasKey).DeepLinkMatcher.actionFilter: dopasowuje dokładneactionciągi (sprawdzaActionExtrasKey).
Dzięki temu możesz używać tego samego wzorca URI w przypadku różnych działań, np. wyświetlania i edytowania:
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 to interfejs funkcjonalny (SAM), możesz też tworzyć filtry za pomocą wyrażeń lambda:
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
Korzystanie z podanych 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 spełniające wszystkie
podane filtry.
Na przykład, aby obsługiwać intencje dotyczące ACTION_APPLICATION_PREFERENCES:
val preferencesActionFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_APPLICATION_PREFERENCES) val preferencesActionDeepLinkMatcher = StaticKeyDeepLinkMatcher(PreferencesScreen, listOf(preferencesActionFilter))
Dopasowywanie precyzyjnych linków URI
Aby dopasowywać hierarchiczne identyfikatory URI do wzorców i wyodrębniać argumenty, użyj 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 wstecz
Aby określić, jak utworzyć syntetyczny stos wstecz na podstawie udanego dopasowania, użyj
BackStackMatcher. Zamiast bezpośrednio tworzyć instancję BackStackMatcher, wywołaj funkcję rozszerzenia withBackStack w innym
DeepLinkMatcher. withBackStack opakowuje odbiorcę w BackStackMatcher
który zwraca BackStackMatchResult zawierający syntetyczny stos wstecz
List. Ponieważ BackStackMatchResult przekazuje porównanie do bazowego wyniku dopasowania, opakowanie dopasowania w withBackStack zachowuje jego pierwotną rangę 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ługiwać wynikowy stos wstecz w aktywności, przeczytaj artykuł Dopasowywanie przychodzącego żądania.