Wenn Sie eingehende DeepLinkRequest-Instanzen Schlüsseln zuordnen möchten, die dem Back Stack Ihrer App hinzugefügt werden können, definieren Sie DeepLinkMatcher-Instanzen.
DeepLinkMatcher ist eine abstrakte Klasse, die zwei Methoden enthält: match und matchRequest. Abgeleitete Klassen müssen matchRequest implementieren, das einen DeepLinkRequest akzeptiert und einen DeepLinkMatcher.MatchResult zurückgibt, wenn die Anfrage übereinstimmt, oder andernfalls null.
Da mehrere Abgleiche mit einer einzelnen Anfrage übereinstimmen können, implementiert MatchResult Comparable, um Ergebnisse zu bewerten und die beste Übereinstimmung auszuwählen.
Typparameter
Die Klasse DeepLinkMatcher deklariert zwei generische Typparameter: DeepLinkMatcher<T : Any, R : DeepLinkMatcher.MatchResult<T>>.
T : Any: Der Typ des Navigationsschlüssels für das Ziel (z. B.UserProfileKeyoderNavKey), der zurückgegeben wird, wenn der Deeplink übereinstimmt.R : DeepLinkMatcher.MatchResult<T>: Der spezifischeMatchResult-Untertyp, der vonmatchRequestundmatchzurückgegeben wird.
Der zweite Typparameter, R, behält spezialisierte Übereinstimmungsinformationen bei, ohne dass ein ungeprüftes Downcasting erforderlich ist:
StaticKeyDeepLinkMatcherbindetRanDeepLinkMatcher.MatchResult<T>.UriDeepLinkMatcherbindetRanUriMatchResultund behält geparste Pfad- und Abfrageargumente sowie Musterübereinstimmungswerte bei.BackStackMatcherbindetRanBackStackMatchResultund behält die synthetische Back-Stack-Liste bei, die vonwithBackStackerstellt wurde.
Anfragen vorfiltern
DeepLinkMatcher-Implementierungen können eine Liste von DeepLinkMatcher.Filter-Instanzen angeben, um Anfragen vor der Auswertung zu filtern.
Die Bibliothek enthält Hilfsfunktionen zum Erstellen gängiger Filter:
DeepLinkMatcher.mimeTypeFilter: Übereinstimmungen mit genauenmimeType-Strings (prüftMimeTypeExtrasKey).DeepLinkMatcher.actionFilter: Übereinstimmungen mit genauenaction-Strings (prüftActionExtrasKey).
Mit diesem Ansatz können Sie dasselbe URI-Muster für verschiedene Aktionen wiederverwenden, z. B. für das Ansehen und Bearbeiten:
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))
Da Filter eine funktionale (SAM) Schnittstelle ist, können Sie Filter auch mit Lambda-Ausdrücken erstellen:
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
Bereitgestellte Matcher verwenden
Die Bibliothek enthält drei Standardimplementierungen von DeepLinkMatcher: StaticKeyDeepLinkMatcher, UriDeepLinkMatcher und BackStackMatcher. Wenn diese Matcher die Anforderungen Ihrer App nicht erfüllen, können Sie benutzerdefinierte Deeplink-Matcher erstellen.
Einfache Deeplinks abgleichen
Verwenden Sie für einfache Deeplinks, die keine Argumente zum Extrahieren haben, StaticKeyDeepLinkMatcher, um Anfragen abzugleichen, die alle angegebenen Filter erfüllen.
Beispiel für die Verarbeitung von Intents für ACTION_APPLICATION_PREFERENCES:
val preferencesActionFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_APPLICATION_PREFERENCES) val preferencesActionDeepLinkMatcher = StaticKeyDeepLinkMatcher(PreferencesScreen, listOf(preferencesActionFilter))
URI-Deeplinks abgleichen
Verwenden Sie UriDeepLinkMatcher, um hierarchische URIs mit Mustern abzugleichen und Argumente zu extrahieren. Sie können beispielsweise www.example.com/users/{id} abgleichen, um das Argument id in einen Zielschlüssel zu extrahieren. Weitere Informationen finden Sie unter URI-Deeplinks abgleichen.
Synthetischen Back Stack erstellen
Mit BackStackMatcher können Sie festlegen, wie ein synthetischer Back Stack aus einer erfolgreichen Übereinstimmung erstellt werden soll. Anstatt BackStackMatcher direkt zu instanziieren, rufen Sie die Erweiterungsfunktion withBackStack für ein anderes DeepLinkMatcher auf. withBackStack verpackt den Empfänger in einen BackStackMatcher, der einen BackStackMatchResult mit einem synthetischen Back Stack List zurückgibt. Da BackStackMatchResult den Vergleich an das zugrunde liegende Abgleichergebnis delegiert, bleibt die ursprüngliche Abgleichrangfolge erhalten, wenn ein Abgleicher in withBackStack verpackt wird.
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) }
Informationen zum Umgang mit dem resultierenden Back Stack in deiner Aktivität findest du unter Eingehende Anfrage abgleichen.