In Android ist ein Deeplink ein Link, über den Sie direkt zu einer bestimmten Ziel innerhalb einer App.
Mit der Komponente „Navigation“ können Sie zwei verschiedene Arten von Deeplinks erstellen: explizit und implizit.
Expliziten Deeplink erstellen
Ein expliziter Deeplink ist eine einzelne Instanz.
eines Deeplinks mit PendingIntent
um Nutzer zu einem
bestimmten Bereich in deiner App zu leiten. Möglicherweise wird eine
expliziten Deeplinks
als Teil einer Benachrichtigung oder eines App-Widgets
.
Öffnet ein Nutzer deine App über einen expliziten Deeplink, wird der Aufgaben-Back-Stack
gelöscht und durch das Deeplink-Ziel ersetzt. Wann?
Diagramme verschachteln,
das Startziel aus jeder Verschachtelungsebene, d. h. das Startziel
von jedem <navigation>
-Element in der Hierarchie – wird ebenfalls dem Stapel hinzugefügt.
Wenn ein Nutzer also von einem Deeplink
navigieren sie im Navigationsstapel wieder nach oben,
haben Ihre App vom Einstiegspunkt aus aufgerufen.
Sie können die NavDeepLinkBuilder
verwenden
Klasse PendingIntent
erstellen,
wie im Beispiel unten gezeigt. Wenn der bereitgestellte Kontext kein
Activity
verwendet der Konstruktor
PackageManager.getLaunchIntentForPackage()
als Standardaktivität für den Start, falls verfügbar.
Kotlin
val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .createPendingIntent()
Java
PendingIntent pendingIntent = new NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .createPendingIntent();
Standardmäßig startet NavDeepLinkBuilder
deinen expliziten Deeplink in
die im Manifest deiner App deklarierte Standard-Activity
für die Einführung. Wenn
Dein NavHost
ist Teil einer anderen Aktivität, du musst deren Komponente angeben
Name beim Erstellen des Deeplink-Builders:
Kotlin
val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(DestinationActivity::class.java) .createPendingIntent()
Java
PendingIntent pendingIntent = new NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(DestinationActivity.class) .createPendingIntent();
Wenn Sie eine ComponentName
haben,
können Sie sie direkt an den Builder übergeben:
Kotlin
val componentName = ... val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(componentName) .createPendingIntent()
Java
ComponentName componentName = ...; PendingIntent pendingIntent = new NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(componentName) .createPendingIntent();
Wenn Sie bereits NavController
haben,
können Sie auch einen Deeplink
NavController.createDeepLink()
Impliziten Deeplink erstellen
Ein impliziter Deeplink bezieht sich auf einen Ziel in einer App ist. Wenn der Deeplink aufgerufen wird, z. B. Ein Nutzer klickt auf einen Link. Android kann dann Ihre App in der entsprechenden Ziel.
Deeplinks können anhand von URI, Intent-Aktionen und MIME-Typen abgeglichen werden. Sie können mehrere Keyword-Optionen für einen einzelnen Deeplink angeben. Der URI Der Argumentabgleich wird zuerst priorisiert, gefolgt von der Aktion und dann dem MIME-Wert. Typ.
Hier ein Beispiel für einen Deeplink, der einen URI, eine Aktion und einen MIME-Typ enthält:
<fragment android:id="@+id/a"
android:name="com.example.myapplication.FragmentA"
tools:layout="@layout/a">
<deepLink app:uri="www.example.com"
app:action="android.intent.action.MY_ACTION"
app:mimeType="type/subtype"/>
</fragment>
Sie können auch den Navigationseditor verwenden, um einen impliziten Deep-Link zu einem Ziel so an:
- Wählen Sie auf dem Tab Design des Navigationseditors das Ziel für um den Deeplink zu öffnen.
- Klicken Sie im Bereich Attribute unter Deeplinks auf +.
Geben Sie im Dialogfeld Deeplink hinzufügen die Informationen zu Ihrem Deeplink zu aktivieren.
Beachten Sie Folgendes:
- Für URIs ohne Schema wird entweder HTTP oder HTTPS angenommen. Beispiel:
www.google.com
stimmt sowohl mithttp://www.google.com
als auch mithttps://www.google.com
- Platzhalter für Pfadparameter im Format
{placeholder_name}
stimmen mit einem oder mehreren überein Zeichen. Beispielsweise stimmthttp://www.example.com/users/{id}
mithttp://www.example.com/users/4
. Die Komponente „Navigation“ versucht, Platzhalterwerte durch Abgleich von Platzhaltern in geeignete Typen parsen Namen zu den definierten Argumenten die für das Deeplink-Ziel definiert sind. Wenn kein Argument mit der wenn derselbe Name definiert ist, wird für das Argument der StandardtypString
verwendet. Wert. Mit dem Platzhalter .* können Sie 0 oder mehr Zeichen abgleichen. - Platzhalter für Suchparameter können anstelle von oder in Verbindung mit
Pfadparameter. Beispiel:
http://www.example.com/users/{id}?myarg={myarg}
Übereinstimmungenhttp://www.example.com/users/4?myarg=28
. - Platzhalter für Suchparameter für Variablen, die mit Standard- oder
Werte, für die Nullwerte zulässig sind, müssen nicht übereinstimmen. Beispiel:
http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2}
Übereinstimmungenhttp://www.example.com/users/4?arg2=28
oderhttp://www.example.com/users/4?arg1=7
Dies gilt nicht für Pfad, Parameter. Beispiel:http://www.example.com/users?arg1=7&arg2=28
entspricht nicht dem obigen Muster, da der erforderliche Pfadparameter nicht angegeben. - Überflüssige Suchparameter wirken sich nicht auf den Abgleich von Deeplink-URIs aus. Für
Beispiel:
http://www.example.com/users/{id}
stimmt mithttp://www.example.com/users/4?extraneousParam=7
, obwohlextraneousParam
ist nicht im URI-Muster definiert.
- Für URIs ohne Schema wird entweder HTTP oder HTTPS angenommen. Beispiel:
Optional: Klicken Sie das Kästchen Automatische Bestätigung an, damit Google überprüft, ob Sie Inhaber des URI ist. Weitere Informationen finden Sie unter Bestätigen Sie Android-App-Links.
Klicken Sie auf Hinzufügen. Ein Linksymbol wird über dem ausgewählten Ziel angezeigt, um anzugeben, dass es ein Deeplink zu aktivieren.
Klicken Sie auf den Tab Code, um zur XML-Ansicht zu wechseln. Ein verschachteltes
<deepLink>
-Element -Element wurde dem Ziel hinzugefügt:<deepLink app:uri="https://www.google.com" />
Wenn Sie implizite Deeplinks aktivieren möchten, müssen Sie auch den Code
manifest.xml
-Datei. Ein einzelnes <nav-graph>
-Element zu einer Aktivität hinzufügen,
verweist auf eine vorhandene Navigationsgrafik, wie im folgenden Beispiel gezeigt:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication"> <application ... > <activity name=".MainActivity" ...> ... <nav-graph android:value="@navigation/nav_graph" /> ... </activity> </application> </manifest>
Beim Erstellen Ihres Projekts ersetzt die Komponente „Navigation“ die Komponente <nav-graph>
mit generierten <intent-filter>
-Elementen, die allen Deeplinks entsprechen
im Navigationsdiagramm.
Beim Auslösen eines impliziten Deeplinks hängt der Status des Back-Stacks davon ab,
ob die implizite Intent
mit dem Parameter
Intent.FLAG_ACTIVITY_NEW_TASK
Flag:
- Wenn das Flag gesetzt ist, wird der Back-Stack der Aufgabe gelöscht und durch den
Deeplink-Ziel. Wie bei expliziten Deeplinks gilt Folgendes:
Diagramme verschachteln
das Startziel aus jeder Verschachtelungsebene – d. h.
Ziel aus jedem
<navigation>
-Element in der Hierarchie – wird ebenfalls zu auf dem Stack. Wenn Nutzende also von einem tiefen Punkt aus navigieren sie im Navigations-Stack nach oben, wenn sie am Einstiegspunkt in die App gelangt sind. - Wenn das Flag nicht gesetzt ist, verbleiben Sie im Aufgabenstack der vorherigen App der implizite Deeplink ausgelöst wurde. In diesem Fall kann die Schaltfläche „Zurück“ gelangst du zurück zur vorherigen App, während mit der Nach-oben-Taste die Aufgabe der App gestartet wird. auf das hierarchische übergeordnete Ziel in Ihrer Navigationsgrafik.
Umgang mit Deeplinks
Es wird dringend empfohlen, immer die Standardeinstellung zu verwenden
launchMode
von standard
wenn Sie die Navigation verwenden. Wenn der standard
-Startmodus verwendet wird,
verarbeitet Deeplinks automatisch, indem sie
handleDeepLink()
explizite oder implizite Deeplinks innerhalb von Intent
zu verarbeiten. Sie können jedoch
Dies geschieht nicht automatisch, wenn Activity
bei der Verwendung von
Alternative launchMode
wie singleTop
. In diesem Fall ist es erforderlich,
um handleDeepLink()
manuell in onNewIntent()
aufzurufen, wie in der
folgendes Beispiel:
Kotlin
override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) navController.handleDeepLink(intent) }
Java
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); navController.handleDeepLink(intent); }
Weitere Informationen
Weitere Informationen zur Navigation finden Sie in den folgenden Ressourcen.