Ab Version 1.2.0 unterstützt Navigation 3 Deeplinks zu
Zielen in Ihrer App mit den Klassen DeepLinkRequest und
DeepLinkMatcher.
So unterstützen Sie Deeplinks in Ihrer App:
- Definieren Sie Intent-Filter in Ihrer
AndroidManifest.xml-Datei, um anzugeben, welche URIs Ihre App verarbeiten kann. - Erstellen Sie
DeepLinkMatcherInstanzen , um eingehende Anfragen Ihren Navigationsschlüsseln zuzuordnen. - Gleichen Sie eingehende Anfragen in der Methode
onCreateoderonNewIntentIhrer Aktivität ab und aktualisieren Sie den Back-Stack entsprechend.
DeepLinkRequest erstellen
Ein DeepLinkRequest stellt einen eingehenden Deeplink dar. Er enthält einen
DeepLinkUri und optional RequestExtras mit zusätzlichen
Informationen wie der Intent-Aktion oder dem MIME-Typ.
// Create a request with a String URI val request = DeepLinkRequest(uri = "https://www.example.com/home") // Create a request from a DeepLinkUri val deepLinkUri = DeepLinkUri("https://www.example.com/home") val requestFromUri = DeepLinkRequest(uri = deepLinkUri) // Create a request with a URI and action val requestWithAction = DeepLinkRequest( uri = "https://www.example.com/home", extras = DeepLinkRequest.actionExtra("android.intent.action.VIEW") ) // Create a request with URI, action and mimeType val requestWithMimeType = DeepLinkRequest( uri = "https://www.example.com/image", extras = requestExtras { put(DeepLinkRequest.ActionExtrasKey, "android.intent.action.VIEW") put(DeepLinkRequest.Companion.MimeTypeExtrasKey, "image/png") } )
DeepLinkRequest-Extras angeben
Verwenden Sie die
RequestExtras Klasse, um zusätzliche Informationen zum Deeplink zu speichern. Damit Sie Extras typsicher definieren und instanziieren können,
bietet die Bibliothek die RequestExtrasKey Schnittstelle und
requestExtras DSL.
Außerdem bietet die Bibliothek zwei Extras-Schlüssel und zugehörige Hilfsfunktionen:
MimeTypeExtrasKey: Wird verwendet, um einen MIME-TypStringzu speichern.ActionExtrasKey(nur Android): Wird verwendet, um einenIntent-Aktions-Stringzu speichern.
val extras: RequestExtras = requestExtras { put(DeepLinkRequest.Companion.MimeTypeExtrasKey, "application/json") put(DeepLinkRequest.ActionExtrasKey, Intent.ACTION_VIEW) } // Access typed values using the get operator val mimeType: String? = extras[DeepLinkRequest.Companion.MimeTypeExtrasKey] val action: String? = extras[DeepLinkRequest.ActionExtrasKey] // Create extras using helper functions and combine them val mimeTypeExtras: RequestExtras = DeepLinkRequest.mimeTypeExtra("application/json") val combinedExtras: RequestExtras = extras + DeepLinkRequest.actionExtra(Intent.ACTION_VIEW)
Wenn Sie eigene benutzerdefinierte Extras definieren möchten, implementieren Sie die RequestExtrasKey
Schnittstelle mit einem typisierten generischen Wert:
// Define a custom typed key: object CampaignIdExtrasKey : RequestExtrasKey<String> val customExtras: RequestExtras = requestExtras { put(CampaignIdExtrasKey, "123") } val campaignId: String? = customExtras[CampaignIdExtrasKey]
Sie können auch emptyRequestExtras() verwenden, um eine leere Instanz zu erstellen, oder
Extras mit den Operatoren + (plus) und - (minus) kombinieren.
DeepLinkRequest aus einem Intent erstellen
Unter Android können Sie ein DeepLinkRequest direkt aus einem Intent erstellen. Wenn es auf diese Weise erstellt wird, wird das DeepLinkRequest so aufgebaut:
- Der
uriwird aus dem Felddatades Intents kopiert. - Wenn nicht null, werden die MIME-Typ- und Aktions-Extras aus den entsprechenden Intent-Feldern festgelegt.
- Alle
intent.extrasmit Werten, die nicht null sind, werden alsSavedStateinDeepLinkRequest.IntentExtrasKeygespeichert. - Alle zusätzlichen Extras, die mit dem Parameter
extrasangegeben wurden, werden hinzugefügt.
object CampaignIdExtrasKey : RequestExtrasKey<String> val intent = Intent(Intent.ACTION_VIEW).apply { data = Uri.parse("https://www.example.com/item/42") type = "application/json" putExtra("user_id", "123") } val request = DeepLinkRequest( intent = intent, extras = requestExtras { put(CampaignIdExtrasKey, "spring_promo") } ) // The resulting DeepLinkRequest contains: val uri = request.uri // "https://www.example.com/item/42" val action = request.extras[DeepLinkRequest.ActionExtrasKey] // "android.intent.action.VIEW" val mimeType = request.extras[DeepLinkRequest.Companion.MimeTypeExtrasKey] // "application/json" val intentExtras: SavedState? = request.extras[DeepLinkRequest.IntentExtrasKey] val userId: String? = intentExtras?.read { getStringOrNull("user_id") } // "123" val campaignId: String? = request.extras[CampaignIdExtrasKey] // "spring_promo"
DeepLinkMatcher-Instanzen erstellen
Ein DeepLinkMatcher ordnet eingehende DeepLinkRequest-Instanzen
Navigationsschlüsseln zu, die dem Back-Stack Ihrer App hinzugefügt werden können. Navigation 3
bietet drei integrierte Matcher: UriDeepLinkMatcher für den
musterbasierten URI-Abgleich, StaticKeyDeepLinkMatcher für grundlegende Links und
BackStackMatcher zum Erstellen synthetischer Back-Stacks. Die Bibliothek unterstützt auch
benutzerdefinierte Matcher für Anwendungsfälle, die nicht von den integrierten
Matchern abgedeckt werden.
Weitere Informationen finden Sie unter DeepLinkMatcher erstellen.
Intent-Filter hinzufügen
Damit ein Deeplink Ihre Aktivität starten kann, müssen Sie die entsprechenden
<intent-filter> Elemente in der AndroidManifest.xml-Datei Ihrer App definieren. Weitere
Informationen finden Sie unter Intent-Filter für eingehende Links hinzufügen.
Eingehende Anfrage abgleichen
Nachdem Sie Ihre erstellt haben DeepLinkMatcher Instanzen, können Sie abgleichen
eingehende Anfragen in Ihrer Aktivität.
So gleichen Sie eine eingehende Anfrage ab:
- Instanziieren Sie Ihre
DeepLinkMatcher-Instanzen. - Führen Sie alle Ihre
DeepLinkMatcher-Instanzen zusammen, entweder explizit oder mit Multibindungen. - Erstellen Sie ein
DeepLinkRequestaus dem eingehendenIntent. - Gleichen Sie die Anfrage mit allen Matchern ab und suchen Sie die beste Übereinstimmung.
- Erstellen Sie den Back-Stack aus dem Abgleichsergebnis.
// 1. Instantiate your DeepLinkMatcher instances. val homeMatcher = StaticKeyDeepLinkMatcher(HomeKey, listOf(DeepLinkMatcher.actionFilter(Intent.ACTION_VIEW))) val userProfileMatcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/users/{id}"), serializer<UserProfileKey>() ).withBackStack { matchResult -> listOf(HomeKey, matchResult.key) } val telMatcher = TelDeepLinkMatcher() // 2. Collate all of your DeepLinkMatcher instances. // Note: Collating matchers with different generic types requires wildcards, // erasing the specific generic types. val deepLinkMatchers: List<DeepLinkMatcher<*, *>> = listOf( homeMatcher, userProfileMatcher, telMatcher ) class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... // 3. Create a DeepLinkRequest from the incoming Intent val request = DeepLinkRequest(intent = intent) // 4. Match the request against all matchers and find the best match. // Because DeepLinkMatcher.MatchResult implements Comparable, you can // use maxOrNull() to find the best match. val matchResult = deepLinkMatchers .mapNotNull { it.match(request) } // List<DeepLinkMatcher.MatchResult<*>> .maxOrNull() // DeepLinkMatcher.MatchResult<*>? // 5. Create the back stack from the match result (or fall back to a default). val backStack: List<NavKey> = when (matchResult) { // If no match is found, use the default back stack (e.g., HomeKey) null -> listOf(HomeKey) // If a BackStackMatchResult is found, use the back stack from the result is BackStackMatchResult<*, *> -> { // Because star-projected matchers erase the key type, cast the back stack to List<NavKey>. @Suppress("UNCHECKED_CAST") matchResult.backStack as List<NavKey> } // Otherwise, use the key from the match result to make a single-item back stack else -> listOf(matchResult.key as NavKey) } } }