Per mappare le istanze DeepLinkRequest in entrata alle chiavi che possono essere aggiunte al back stack della tua 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, altrimenti null.
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 deep link 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, conservando il percorso analizzato e gli argomenti della query insieme ai punteggi di corrispondenza dei pattern.BackStackMatcherassociaRaBackStackMatchResult, mantenendo l'elenco del back stack sintetico creato dawithBackStack.
Richieste di pre-filtraggio
Le implementazioni di DeepLinkMatcher possono specificare un elenco di istanze DeepLinkMatcher.Filter per filtrare le richieste prima di valutarle.
La libreria include funzioni helper per creare filtri comuni:
DeepLinkMatcher.mimeTypeFilter: corrisponde a stringhemimeTypeesatte (controllaMimeTypeExtrasKey).DeepLinkMatcher.actionFilter: corrisponde a stringheactionesatte (controllaActionExtrasKey).
Questo approccio ti consente di riutilizzare lo stesso pattern URI per azioni diverse, ad esempio la visualizzazione e la 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 espressioni lambda:
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
Utilizza i matcher forniti
La libreria include tre implementazioni DeepLinkMatcher standard:
StaticKeyDeepLinkMatcher, UriDeepLinkMatcher e
BackStackMatcher. Se questi matcher non soddisfano i requisiti della tua app,
puoi creare matcher di deep link personalizzati.
Corrispondenza dei deep link di base
Per i deep link di base che non hanno argomenti da estrarre, utilizza
StaticKeyDeepLinkMatcher per trovare le richieste con corrispondenza che soddisfano tutti
i filtri forniti.
Ad esempio, per gestire gli intent per ACTION_APPLICATION_PREFERENCES:
val preferencesActionFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_APPLICATION_PREFERENCES) val preferencesActionDeepLinkMatcher = StaticKeyDeepLinkMatcher(PreferencesScreen, listOf(preferencesActionFilter))
Corrispondenza dei deep link URI
Per trovare corrispondenze tra URI gerarchici e pattern ed estrarre argomenti, utilizza UriDeepLinkMatcher. Ad esempio, puoi trovare una corrispondenza con www.example.com/users/{id} per estrarre l'argomento id in una chiave di destinazione. Per saperne di più, consulta Crea una corrispondenza con i deep link URI.
Crea 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 aggrega 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 conserva il ranking 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à, consulta Trova una richiesta in arrivo.