Unter Android ist ein Deeplink ein Link, über den Sie direkt zu einem bestimmten Ziel innerhalb einer App weitergeleitet werden.
Mit der Navigationskomponente können Sie zwei verschiedene Arten von Deeplinks erstellen: explizite und implizite.
Expliziten Deeplink erstellen
Ein expliziter Deeplink ist eine einzelne Instanz eines Deeplinks, über den Nutzer mithilfe eines PendingIntent
zu einer bestimmten Stelle in Ihrer App weitergeleitet werden. Sie können einen expliziten Deeplink beispielsweise in einer Benachrichtigung oder einem App-Widget anzeigen lassen.
Wenn ein Nutzer Ihre App über einen expliziten Deeplink öffnet, wird der Task-Backstack gelöscht und durch das Deeplink-Ziel ersetzt. Wenn Sie Diagramme verschachteln, wird dem Stack auch das Startziel jeder Verschachtelungsebene hinzugefügt, also das Startziel jedes <navigation>
-Elements in der Hierarchie.
Wenn ein Nutzer also über einen Deeplink zu einer Zielseite gelangt und die Schaltfläche „Zurück“ drückt, wird er durch den Navigationsstack zurückgeführt, als wäre er über den Einstiegspunkt in Ihre App gelangt.
Mit der Klasse NavDeepLinkBuilder
können Sie ein PendingIntent
erstellen, wie im folgenden Beispiel gezeigt. Wenn der angegebene Kontext kein Activity
ist, verwendet der Konstruktor PackageManager.getLaunchIntentForPackage()
als Standardaktivität, sofern 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
Ihren expliziten Deeplink im Standardstart Activity
, der im Manifest Ihrer App deklariert ist. Wenn sich Ihre NavHost
in einer anderen Aktivität befindet, müssen Sie beim Erstellen des Deeplink-Builders den Komponentennamen angeben:
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 du bereits eine NavController
hast, kannst du auch einen Deeplink mit NavController.createDeepLink()
erstellen.
Impliziten Deeplink erstellen
Ein impliziter Deeplink bezieht sich auf ein bestimmtes Ziel in einer App. Wenn der Deeplink aufgerufen wird, z. B. wenn ein Nutzer auf einen Link klickt, kann Android Ihre App mit dem entsprechenden Ziel öffnen.
Deeplinks können anhand von URIs, Intent-Aktionen und MIME-Typen abgeglichen werden. Sie können mehrere Keyword-Optionen für einen einzelnen Deeplink angeben. Beachten Sie jedoch, dass die Übereinstimmung des URI-Arguments zuerst priorisiert wird, gefolgt von der Aktion und dann dem MIME-Typ.
Hier ein Beispiel für einen Deeplink mit einem URI, einer Aktion und einem MIME-Typ:
<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 Deeplink zu einem Ziel zu erstellen. Gehen Sie dazu so vor:
- Wählen Sie auf dem Tab Design des Navigationseditors das Ziel für den Deeplink aus.
- Klicken Sie im Bereich Attribute unter Deeplinks auf +.
Geben Sie im Dialogfeld Deeplink hinzufügen die Informationen für Ihren Deeplink ein.
Beachten Sie Folgendes:
- Für URIs ohne Schema wird davon ausgegangen, dass sie entweder http oder https sind. Beispielsweise entspricht
www.google.com
sowohlhttp://www.google.com
als auchhttps://www.google.com
. - Platzhalter für Pfadparameter in Form von
{placeholder_name}
stimmen mit einem oder mehreren Zeichen überein. Beispielsweise führthttp://www.example.com/users/{id}
zu Übereinstimmungen mithttp://www.example.com/users/4
. Die Navigationskomponente versucht, die Platzhalterwerte in die entsprechenden Typen zu parsen, indem Platzhalternamen mit den definierten Argumenten abgeglichen werden, die für das Deeplink-Ziel definiert sind. Wenn kein Argument mit demselben Namen definiert ist, wird für den Argumentwert ein StandardString
-Typ verwendet. Mit dem Platzhalter „*.“ können null oder mehr Zeichen abgeglichen werden. - Platzhalter für Abfrageparameter können anstelle von oder in Verbindung mit Pfadparametern verwendet werden. Beispiel:
http://www.example.com/users/{id}?myarg={myarg}
stimmt mithttp://www.example.com/users/4?myarg=28
überein. - Abfrageparameter-Platzhalter für Variablen, die mit Standard- oder optionalen Werten definiert sind, müssen nicht übereinstimmen. Beispielsweise führt
http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2}
zu Übereinstimmungen mithttp://www.example.com/users/4?arg2=28
oderhttp://www.example.com/users/4?arg1=7
. Das ist bei Pfadparametern nicht der Fall.http://www.example.com/users?arg1=7&arg2=28
entspricht beispielsweise nicht dem obigen Muster, da der erforderliche Pfadparameter nicht angegeben ist. - Fremde Abfrageparameter haben keine Auswirkungen auf die Deeplink-URI-Übereinstimmung. Beispiel:
http://www.example.com/users/{id}
stimmt mithttp://www.example.com/users/4?extraneousParam=7
überein, auch wennextraneousParam
im URI-Muster nicht definiert ist.
- Für URIs ohne Schema wird davon ausgegangen, dass sie entweder http oder https sind. Beispielsweise entspricht
Optional: Klicken Sie das Kästchen Automatisch bestätigen an, damit Google überprüft, ob Sie der Inhaber des URIs sind. Weitere Informationen finden Sie unter Android-App-Links überprüfen.
Klicken Sie auf Hinzufügen. Über dem ausgewählten Ziel wird ein Linksymbol angezeigt, um anzugeben, dass es sich um ein Deeplink-Ziel handelt.
Klicken Sie auf den Tab Code, um zur XML-Ansicht zu wechseln. Dem Ziel wurde ein verschachteltes
<deepLink>
-Element hinzugefügt:<deepLink app:uri="https://www.google.com" />
Wenn Sie implizite Deeplinks aktivieren möchten, müssen Sie auch die manifest.xml
-Datei Ihrer App ergänzen. Fügen Sie einer Aktivität ein einzelnes <nav-graph>
-Element hinzu, das auf ein vorhandenes Navigationsdiagramm verweist, 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 Navigationskomponente das <nav-graph>
-Element durch generierte <intent-filter>
-Elemente, um allen Deeplinks im Navigationsgraphen zu entsprechen.
Wenn ein impliziter Deeplink ausgelöst wird, hängt der Status des Backstacks davon ab, ob der implizite Intent
mit dem Flag Intent.FLAG_ACTIVITY_NEW_TASK
gestartet wurde:
- Wenn das Flag gesetzt ist, wird der Backstack der Aufgabe gelöscht und durch das Deeplink-Ziel ersetzt. Wie beim expliziten Deeplink wird beim Verschachteln von Grafiken auch das Startziel jeder Verschachtelungsebene, also das Startziel jedes
<navigation>
-Elements in der Hierarchie, dem Stapel hinzugefügt. Wenn ein Nutzer also über einen Deeplink auf die Schaltfläche „Zurück“ klickt, wird er durch den Navigationsstack zurückgeführt, als wäre er über den Einstiegspunkt in Ihre App gelangt. - Wenn das Flag nicht festgelegt ist, bleiben Sie im Task-Stack der vorherigen App, in der der implizite Deeplink ausgelöst wurde. In diesem Fall kehren Sie mit der Schaltfläche „Zurück“ zur vorherigen App zurück. Mit der Schaltfläche „Oben“ wird die Aufgabe Ihrer App im übergeordneten Zielknoten des Navigationsdiagramms gestartet.
Umgang mit Deeplinks
Wir empfehlen dringend, bei der Navigation immer die Standardeinstellung launchMode
von standard
zu verwenden. Wenn Sie den Startmodus standard
verwenden, werden Deeplinks automatisch von der Navigation verarbeitet. Dazu wird handleDeepLink()
aufgerufen, um alle expliziten oder impliziten Deeplinks in der Intent
zu verarbeiten. Das geschieht jedoch nicht automatisch, wenn die Activity
wiederverwendet wird, wenn eine alternative launchMode
wie singleTop
verwendet wird. In diesem Fall muss handleDeepLink()
in onNewIntent()
manuell aufgerufen werden, wie im folgenden Beispiel gezeigt:
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.