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:
- Definiere Intent-Filter in deiner
AndroidManifest.xml, um anzugeben, welche URIs deine App verarbeiten kann. - Erstellen Sie
DeepLinkMatcher-Instanzen, 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 ein DeepLinkUri und optional ein RequestExtras mit zusätzlichen Informationen, z. B. 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 bereitstellen
Wenn Sie zusätzliche Informationen zum Deeplink speichern möchten, verwenden Sie die Klasse RequestExtras. Damit die Definition und Instanziierung von Extras typsicher ist, bietet die Bibliothek die Schnittstelle RequestExtrasKey und die DSL requestExtras.
Außerdem bietet die Bibliothek zwei zusätzliche Schlüssel und zugehörige Hilfsprogramme:
MimeTypeExtrasKey: Wird zum Speichern eines MIME-TypsStringverwendet.ActionExtrasKey(nur Android): Wird verwendet, um die AktionStringeinesIntentzu 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 Schnittstelle RequestExtrasKey mit einem typisierten generischen Typ:
// 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 einen DeepLinkRequest direkt aus einem Intent erstellen. Bei dieser Konstruktion wird der DeepLinkRequest so erstellt:
- Der
uriwird aus dem Felddatades Intents kopiert. - Wenn der Wert nicht null ist, werden der MIME-Typ und die 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 werden, 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 Navigationstasten zu, die dem Back Stack Ihrer App hinzugefügt werden können. Navigation 3 bietet drei integrierte Matcher: UriDeepLinkMatcher für den mustergestützten URI-Abgleich, StaticKeyDeepLinkMatcher für einfache Links und BackStackMatcher für das 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 deine Aktivität starten kann, musst du die entsprechenden <intent-filter>-Elemente in der AndroidManifest.xml deiner App definieren. Weitere Informationen finden Sie unter Intent-Filter für eingehende Links hinzufügen.
Eingehende Anfrage abgleichen
Nachdem Sie Ihre DeepLinkMatcher-Instanzen erstellt haben, können Sie eingehende Anfragen in Ihrer Aktivität abgleichen.
Führen Sie die folgenden Schritte aus, um eine eingehende Anfrage abzugleichen:
- Instanziieren Sie Ihre
DeepLinkMatcher-Instanzen. - Fassen Sie alle
DeepLinkMatcher-Instanzen zusammen, entweder explizit oder mithilfe von Multibindings. - Erstellen Sie eine
DeepLinkRequestaus der eingehendenIntent. - Gleicht die Anfrage mit allen Abgleichern ab und findet die beste Übereinstimmung.
- Erstelle den Back Stack aus dem Spielergebnis.
// 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) } } }