Para asignar instancias DeepLinkRequest entrantes a claves que se pueden agregar a
la pila de actividades de tu app, define instancias DeepLinkMatcher.
DeepLinkMatcher es una clase abstracta que incluye dos métodos: match y matchRequest. Las subclases deben implementar matchRequest, que toma un
DeepLinkRequest y muestra un DeepLinkMatcher.MatchResult si la
solicitud coincide o null en caso contrario.
Debido a que varios comparadores pueden coincidir con una sola solicitud, MatchResult implementa
Comparable para clasificar los resultados y seleccionar la mejor coincidencia.
Parámetros de tipo
La clase DeepLinkMatcher declara dos parámetros de tipo genérico:
DeepLinkMatcher<T : Any, R : DeepLinkMatcher.MatchResult<T>>.
T : Any: Es el tipo de clave de navegación de destino (comoUserProfileKeyoNavKey) que se muestra cuando coincide el vínculo directo.R : DeepLinkMatcher.MatchResult<T>: Es el subtipoMatchResultespecífico que muestranmatchRequestymatch.
El segundo parámetro de tipo, R, conserva la información de coincidencia especializada sin requerir una conversión forzada no verificada:
StaticKeyDeepLinkMatchervinculaRaDeepLinkMatcher.MatchResult<T>.UriDeepLinkMatchervinculaRaUriMatchResult, reteniendo la ruta analizada y los argumentos de consulta junto con las puntuaciones de coincidencia de patrones.BackStackMatchervinculaRaBackStackMatchResult, reteniendo la lista de pila de actividades sintética construida porwithBackStack.
Cómo aplicar un filtro previo a las solicitudes
Las implementaciones de DeepLinkMatcher pueden especificar una lista de
DeepLinkMatcher.Filter instancias para filtrar las solicitudes antes de
evaluarlas.
La biblioteca incluye funciones auxiliares para crear filtros comunes:
DeepLinkMatcher.mimeTypeFilter: Coincide con cadenasmimeTypeexactas (verificaMimeTypeExtrasKey).DeepLinkMatcher.actionFilter: Coincide con cadenasactionexactas (verificaActionExtrasKey).
Este enfoque te permite reutilizar el mismo patrón de URI para diferentes acciones, como ver en comparación con editar:
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))
Debido a que Filter es una interfaz funcional (SAM), también puedes crear filtros con expresiones lambda:
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
Cómo usar comparadores proporcionados
La biblioteca incluye tres DeepLinkMatcher implementaciones estándar:
StaticKeyDeepLinkMatcher, UriDeepLinkMatcher y
BackStackMatcher. Si estos comparadores no cumplen con los requisitos de tu app,
puedes crear comparadores de vínculos directos personalizados.
Cómo hacer coincidir vínculos directos básicos
Para los vínculos directos básicos que no tienen argumentos para extraer, usa
StaticKeyDeepLinkMatcher para hacer coincidir las solicitudes que cumplen con todos los
filtros proporcionados.
Por ejemplo, para controlar intents para ACTION_APPLICATION_PREFERENCES:
val preferencesActionFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_APPLICATION_PREFERENCES) val preferencesActionDeepLinkMatcher = StaticKeyDeepLinkMatcher(PreferencesScreen, listOf(preferencesActionFilter))
Cómo hacer coincidir vínculos directos de URI
Para hacer coincidir URIs jerárquicos con patrones y extraer argumentos, usa UriDeepLinkMatcher. Por ejemplo, puedes hacer coincidir www.example.com/users/{id} para
extraer el id argumento en una clave de destino. Para obtener más información, consulta
Cómo hacer coincidir vínculos directos de URI.
Cómo compilar una pila de actividades sintética
Para definir cómo compilar una pila de actividades sintética a partir de una coincidencia exitosa, usa
BackStackMatcher. En lugar de crear instancias de BackStackMatcher
directamente, llama a la withBackStack función de extensión en otro
DeepLinkMatcher. withBackStack une el receptor en un BackStackMatcher
que muestra un BackStackMatchResult que contiene una pila de actividades sintética
List. Debido a que BackStackMatchResult delega la comparación al resultado de coincidencia subyacente, unir un comparador en withBackStack conserva su clasificación de coincidencia 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 controlar la pila de actividades resultante en tu actividad, consulta Cómo hacer coincidir una solicitud entrante.