Para mapear instâncias DeepLinkRequest recebidas para chaves que podem ser adicionadas a
backstack do app, defina instâncias DeepLinkMatcher.
DeepLinkMatcher é uma classe abstrata que inclui dois métodos, match
e matchRequest. As subclasses precisam implementar matchRequest, que recebe 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 junto com as pontuações de correspondência de padrões.BackStackMatchervinculaRaBackStackMatchResult, mantendo a lista de backstack sintética construída porwithBackStack.
Pré-filtrar solicitações
DeepLinkMatcher implementações podem especificar uma lista de
DeepLinkMatcher.Filter instâncias para filtrar 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 diferentes ações, 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 correspondentes fornecidos
A biblioteca inclui três implementações padrão:DeepLinkMatcher
StaticKeyDeepLinkMatcher, UriDeepLinkMatcher e
BackStackMatcher. Se esses correspondentes não atenderem aos requisitos do app,
você pode criar correspondentes de link direto personalizados.
Corresponder links diretos básicos
Para links diretos básicos que não têm argumentos a serem extraídos, use
StaticKeyDeepLinkMatcher para corresponder a solicitações que atendam 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 corresponder URIs hierárquicos a padrões e extrair argumentos, use UriDeepLinkMatcher. Por exemplo, é possível corresponder www.example.com/users/{id} para
extrair o id argumento 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 a partir de uma correspondência bem-sucedida, use
BackStackMatcher. Em vez de instanciar BackStackMatcher
diretamente, chame a withBackStack função de extensão em outro
DeepLinkMatcher. withBackStack envolve o receptor em um BackStackMatcher
que retorna um BackStackMatchResult contendo uma backstack sintética
List. Como BackStackMatchResult delega a comparação ao resultado da correspondência subjacente, o encapsulamento de um correspondente 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 atividade, consulte Corresponder uma solicitação recebida.