Para asignar instancias entrantes de DeepLinkRequest a claves que se puedan agregar a la pila de actividades de tu app, debes definir instancias de DeepLinkMatcher.
DeepLinkMatcher es una clase abstracta que incluye dos métodos, match y matchRequest. Las subclases deben implementar matchRequest, que toma un DeepLinkRequest y devuelve un DeepLinkMatcher.MatchResult si la solicitud coincide, o null de lo 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 devuelve cuando coincide el vínculo directo.R : DeepLinkMatcher.MatchResult<T>: Es el subtipo específico deMatchResultque devuelvenmatchRequestymatch.
El segundo parámetro de tipo, R, conserva la información de coincidencia especializada sin requerir una conversión de tipo de datos no verificada:
StaticKeyDeepLinkMatchervinculaRaDeepLinkMatcher.MatchResult<T>.UriDeepLinkMatchervinculaRaUriMatchResult, lo que conserva la ruta de acceso analizada y los argumentos de consulta junto con las puntuaciones de coincidencia de patrones.BackStackMatchervinculaRaBackStackMatchResult, lo que conserva la lista de pila de actividades sintética que creówithBackStack.
Solicitudes de filtrado previo
Las implementaciones de DeepLinkMatcher pueden especificar una lista de instancias de DeepLinkMatcher.Filter 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 o 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))
Como Filter es una interfaz funcional (SAM), también puedes crear filtros con expresiones lambda:
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
Usa los comparadores proporcionados
La biblioteca incluye tres implementaciones estándar de DeepLinkMatcher: 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
En el caso de los vínculos directos básicos que no tienen argumentos para extraer, usa StaticKeyDeepLinkMatcher para que coincidan con las solicitudes que cumplen con todos los filtros proporcionados.
Por ejemplo, para controlar intents de ACTION_APPLICATION_PREFERENCES, haz lo siguiente:
val preferencesActionFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_APPLICATION_PREFERENCES) val preferencesActionDeepLinkMatcher = StaticKeyDeepLinkMatcher(PreferencesScreen, listOf(preferencesActionFilter))
Cómo hacer coincidir los vínculos directos de URI
Para hacer coincidir los URI jerárquicos con patrones y extraer argumentos, usa UriDeepLinkMatcher. Por ejemplo, puedes hacer coincidir www.example.com/users/{id} para extraer el argumento id 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 una instancia de BackStackMatcher directamente, llama a la función de extensión withBackStack en otro DeepLinkMatcher. withBackStack une el receptor en un BackStackMatcher que devuelve 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.