Para mapear instâncias de DeepLinkRequest recebidas para chaves que podem ser adicionadas à
backstack do app, defina instâncias de DeepLinkMatcher.
DeepLinkMatcher é uma classe abstrata que inclui dois métodos, match
e matchRequest. As subclasses precisam implementar matchRequest, que usa um
DeepLinkRequest e retorna um DeepLinkMatcher.MatchResult se a
solicitação corresponder ou null caso contrário.
Como vários correspondentes podem corresponder a uma única solicitação, MatchResult implementa
Comparable para classificar os resultados e selecionar a melhor correspondência.
Parâmetros de tipo
A classe DeepLinkMatcher declara dois parâmetros de tipo genérico:
DeepLinkMatcher<T : Any, R : DeepLinkMatcher.MatchResult<T>>.
T : Any: o tipo de chave de navegação de destino (comoUserProfileKeyouNavKey) retornado quando o link direto corresponde.R : DeepLinkMatcher.MatchResult<T>: o subtipoMatchResultespecífico retornado pormatchRequestematch.
O segundo parâmetro de tipo, R, preserva informações de correspondência especializadas sem
exigir downcasting não verificado:
StaticKeyDeepLinkMatchervinculaRaDeepLinkMatcher.MatchResult<T>.UriDeepLinkMatchervinculaRaUriMatchResult, mantendo o caminho analisado e os argumentos de consulta, além das pontuações de correspondência de padrão.BackStackMatchervinculaRaBackStackMatchResult, mantendo a lista de backstack sintética criada porwithBackStack.
Solicitações de pré-filtragem
As implementações de DeepLinkMatcher podem especificar uma lista de instâncias de DeepLinkMatcher.Filter para filtrar as solicitações antes de avaliá-las.
A biblioteca inclui funções auxiliares para criar filtros comuns:
DeepLinkMatcher.mimeTypeFilter: corresponde a stringsmimeTypeexatas (verificaMimeTypeExtrasKey).DeepLinkMatcher.actionFilter: corresponde a stringsactionexatas (verificaActionExtrasKey).
Essa abordagem permite reutilizar o mesmo padrão de URI para ações diferentes, como visualização e edição:
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))
Como Filter é uma interface funcional (SAM), também é possível criar filtros
usando expressões lambda:
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
Usar os comparadores fornecidos
A biblioteca inclui três implementações padrão de DeepLinkMatcher:
StaticKeyDeepLinkMatcher, UriDeepLinkMatcher e
BackStackMatcher. Se esses correspondentes não atenderem aos requisitos do seu app,
crie correspondentes de link direto personalizados.
Corresponder links diretos básicos
Para links diretos básicos que não têm argumentos para extrair, use
StaticKeyDeepLinkMatcher para corresponder às solicitações que atendem a todos
os filtros fornecidos.
Por exemplo, para processar intents de ACTION_APPLICATION_PREFERENCES:
val preferencesActionFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_APPLICATION_PREFERENCES) val preferencesActionDeepLinkMatcher = StaticKeyDeepLinkMatcher(PreferencesScreen, listOf(preferencesActionFilter))
Corresponder links diretos de URI
Para comparar URIs hierárquicos com padrões e extrair argumentos, use
UriDeepLinkMatcher. Por exemplo, é possível usar www.example.com/users/{id} para
extrair o argumento id em uma chave de destino. Para mais informações, consulte
Corresponder links diretos de URI.
Criar uma backstack sintética
Para definir como criar uma backstack sintética com base em uma correspondência, use
BackStackMatcher. Em vez de instanciar BackStackMatcher
diretamente, chame a função de extensão withBackStack em outro
DeepLinkMatcher. withBackStack une o receptor em um BackStackMatcher
que retorna um BackStackMatchResult que contém uma backstack sintética
List. Como BackStackMatchResult delega a comparação ao resultado de correspondência
subjacente, o encapsulamento de um matcher em withBackStack preserva a classificação de correspondência
original.
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) }
Para processar a backstack resultante na sua atividade, consulte Corresponder a uma solicitação recebida.