Per mappare le istanze DeepLinkRequest in entrata alle chiavi che possono essere aggiunte a
allo stack indietro dell'app, definisci le istanze DeepLinkMatcher.
DeepLinkMatcher è una classe astratta che include due metodi, match
e matchRequest. Le sottoclassi devono implementare matchRequest, che accetta un
DeepLinkRequest e restituisce un DeepLinkMatcher.MatchResult se la
richiesta corrisponde o null in caso contrario.
Poiché più matcher potrebbero corrispondere a una singola richiesta, MatchResult implementa
Comparable per classificare i risultati e selezionare la corrispondenza migliore.
Parametri di tipo
La classe DeepLinkMatcher dichiara due parametri di tipo generico:
DeepLinkMatcher<T : Any, R : DeepLinkMatcher.MatchResult<T>>.
T : Any: il tipo di chiave di navigazione di destinazione (ad esempioUserProfileKeyoNavKey) restituito quando il link diretto corrisponde.R : DeepLinkMatcher.MatchResult<T>: il sottotipoMatchResultspecifico restituito damatchRequestematch.
Il secondo parametro di tipo, R, conserva le informazioni di corrispondenza specializzate senza richiedere il downcasting non controllato:
StaticKeyDeepLinkMatcherassociaRaDeepLinkMatcher.MatchResult<T>.UriDeepLinkMatcherassociaRaUriMatchResult, mantenendo gli argomenti del percorso e della query analizzati insieme ai punteggi di corrispondenza dei pattern.BackStackMatcherassociaRaBackStackMatchResult, mantenendo l'elenco del back stack sintetico costruito dawithBackStack.
Pre-filtrare le richieste
DeepLinkMatcher implementazioni possono specificare un elenco di
DeepLinkMatcher.Filter istanze per filtrare le richieste prima di
valutarle.
La libreria include funzioni di assistenza per creare filtri comuni:
DeepLinkMatcher.mimeTypeFilter: corrisponde alle stringhe esattemimeType(controllaMimeTypeExtrasKey).DeepLinkMatcher.actionFilter: corrisponde alle stringheactionesatte (controllaActionExtrasKey).
Questo approccio ti consente di riutilizzare lo stesso pattern URI per azioni diverse, ad esempio visualizzazione e modifica:
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))
Poiché Filter è un'interfaccia funzionale (SAM), puoi anche creare filtri utilizzando le espressioni lambda:
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
Utilizzare i matcher forniti
La libreria include tre implementazioni standard DeepLinkMatcher:
StaticKeyDeepLinkMatcher, UriDeepLinkMatcher e
BackStackMatcher. Se questi matcher non soddisfano i requisiti dell'app,
puoi creare matcher di link diretti personalizzati.
Corrispondere ai link diretti di base
Per i link diretti di base che non hanno argomenti da estrarre, utilizza
StaticKeyDeepLinkMatcher per trovare le richieste che soddisfano tutti i
filtri forniti.
Ad esempio, per gestire gli intenti per ACTION_APPLICATION_PREFERENCES:
val preferencesActionFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_APPLICATION_PREFERENCES) val preferencesActionDeepLinkMatcher = StaticKeyDeepLinkMatcher(PreferencesScreen, listOf(preferencesActionFilter))
Corrispondere ai link diretti URI
Per trovare gli URI gerarchici rispetto ai pattern ed estrarre gli argomenti, utilizza UriDeepLinkMatcher. Ad esempio, puoi trovare www.example.com/users/{id} per
estrarre l'argomento id in una chiave di destinazione. Per saperne di più, vedi
Trovare i link diretti URI.
Creare un back stack sintetico
Per definire come creare un back stack sintetico da una corrispondenza riuscita, utilizza
BackStackMatcher. Anziché creare un'istanza di BackStackMatcher
direttamente, chiama la funzione di estensione withBackStack su un altro
DeepLinkMatcher. withBackStack racchiude il ricevitore in un BackStackMatcher
che restituisce un BackStackMatchResult contenente un back stack sintetico
List. Poiché BackStackMatchResult delega il confronto al risultato di corrispondenza sottostante, il wrapping di un matcher in withBackStack ne conserva la classificazione di corrispondenza originale.
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) }
Per gestire il back stack risultante nella tua attività, vedi Trovare una richiesta in entrata.