Deeplink für ein Ziel erstellen

In Android ist ein Deeplink ein Link, der Sie direkt zu einem bestimmten Ziel innerhalb einer App führt.

Mit der Navigationskomponente können Sie zwei verschiedene Arten von Deeplinks erstellen: explizit und implizit.

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 in einem App-Widget anzeigen.

Wenn ein Nutzer Ihre App über einen expliziten Deeplink öffnet, wird der Aufgaben-Back-Stack gelöscht und durch das Deeplink-Ziel ersetzt. Beim Verschachteln von Grafiken wird das Startziel jeder Verschachtelungsebene, also das Startziel jedes <navigation>-Elements in der Hierarchie, dem Stack hinzugefügt. Wenn ein Nutzer also von einem Deeplink-Ziel aus auf die Schaltfläche „Zurück“ tippt, navigiert er wieder nach oben im Navigationsstapel, so als ob er vom Einstiegspunkt aus deine App aufrufen würde.

Mit der Klasse NavDeepLinkBuilder können Sie ein PendingIntent-Objekt erstellen, wie im folgenden Beispiel gezeigt. Wenn der bereitgestellte Kontext kein Activity ist, verwendet der Konstruktor PackageManager.getLaunchIntentForPackage() als Standardaktivität zum Starten, 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 deinen expliziten Deeplink in der standardmäßigen Start-Activity, die im Manifest deiner App deklariert ist. Wenn sich NavHost in einer anderen Aktivität befindet, müssen Sie beim Erstellen des Deeplink-Builders den zugehörigen 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 einen ComponentName haben, können Sie ihn 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 einen NavController haben, können Sie auch mit NavController.createDeepLink() einen Deeplink 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 für das entsprechende Ziel öffnen.

Deeplinks können nach URI, Intent-Aktionen und MIME-Typen abgeglichen werden. Sie können mehrere Übereinstimmungstypen für einen einzelnen Deeplink angeben. Der Abgleich von URI-Argumenten wird jedoch zuerst priorisiert, gefolgt von der Aktion und dann dem MIME-Typ.

Hier ist 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 Deeplink zu einem Ziel zu erstellen:

  1. Wählen Sie im Tab Design des Navigationseditors das Ziel für den Deeplink aus.
  2. Klicken Sie im Bereich Attribute im Bereich Deeplinks auf +.
  3. Geben Sie im Dialogfeld Deeplink hinzufügen die Informationen für den Deeplink ein.

    Beachten Sie Folgendes:

    • URIs ohne Schema werden entweder als HTTP oder HTTPS angenommen. Beispiel: www.google.com stimmt sowohl mit http://www.google.com als auch mit https://www.google.com überein.
    • Platzhalter für Pfadparameter in Form von {placeholder_name} entsprechen einem oder mehreren Zeichen. Beispiel: http://www.example.com/users/{id} stimmt mit http://www.example.com/users/4 überein. Die Navigationskomponente versucht, die Platzhalterwerte in geeignete Typen zu parsen, indem die Platzhalternamen den definierten Argumenten zugeordnet werden, die für das Deeplink-Ziel definiert sind. Wenn kein Argument mit demselben Namen definiert ist, wird der Standardtyp String für den Argumentwert verwendet. Sie können den Platzhalter .* verwenden, um null oder mehr Zeichen abzugleichen.
    • 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 mit http://www.example.com/users/4?myarg=28 überein.
    • Platzhalter für Abfrageparameter für Variablen, die mit Standardwerten oder Nullwerten definiert sind, müssen nicht übereinstimmen. Beispiel: http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2} stimmt mit http://www.example.com/users/4?arg2=28 oder http://www.example.com/users/4?arg1=7 überein. Dies 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.
    • Überflüssige Abfrageparameter wirken sich nicht auf den Deeplink-URI-Abgleich aus. http://www.example.com/users/{id} entspricht beispielsweise http://www.example.com/users/4?extraneousParam=7, obwohl extraneousParam nicht im URI-Muster definiert ist.
  4. Optional: Klicken Sie das Kästchen Automatische Bestätigung an, damit Google bestätigen muss, dass Sie der Inhaber des URI sind. Weitere Informationen finden Sie unter Android-App-Links bestätigen.

  5. Klicken Sie auf Hinzufügen. Über dem ausgewählten Ziel wird ein Linksymbol angezeigt, wenn das Ziel einen Deeplink hat.

  6. 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" />
    

Um implizite Deeplinks zu aktivieren, müssen Sie auch die Datei manifest.xml Ihrer App ergänzen. Fügen Sie einer Aktivität, die auf ein vorhandenes Navigationsdiagramm verweist, ein einzelnes <nav-graph>-Element hinzu, 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, die mit allen Deeplinks im Navigationsdiagramm übereinstimmen.

Beim Auslösen eines impliziten Deeplinks hängt der Status des Back-Stacks davon ab, ob das implizite Intent mit dem Flag Intent.FLAG_ACTIVITY_NEW_TASK gestartet wurde:

  • Wenn das Flag gesetzt ist, wird der Aufgaben-Back-Stack gelöscht und durch das Deeplinks-Ziel ersetzt. Wie bei expliziten Deeplinks wird beim Verschachteln von Diagrammen auch das Startziel von jeder Verschachtelungsebene, also das Startziel jedes <navigation>-Elements in der Hierarchie, dem Stack hinzugefügt. Wenn ein Nutzer also von einem Deeplink-Ziel auf die Schaltfläche „Zurück“ drückt, navigiert er wieder nach oben im Navigationsstapel, so als ob er Ihre App vom Einstiegspunkt aus aufgerufen hätte.
  • Wenn das Flag nicht festgelegt ist, bleiben Sie im Aufgaben-Stack der vorherigen App, in der der implizite Deeplink ausgelöst wurde. In diesem Fall gelangen Sie über die Schaltfläche „Back“ (Zurück) zur vorherigen App zurück, während mit der Schaltfläche „Up“ (Nach oben) die Aufgabe Ihrer App für das hierarchische übergeordnete Ziel in Ihrer Navigationsgrafik gestartet wird.

Deeplinks

Es wird dringend empfohlen, bei der Navigation immer den Standardwert launchMode standard zu verwenden. Im Startmodus standard verarbeitet Navigation automatisch Deeplinks. Dazu wird handleDeepLink() aufgerufen, um explizite oder implizite Deeplinks innerhalb der Intent zu verarbeiten. Dies geschieht jedoch nicht automatisch, wenn das Activity bei Verwendung einer alternativen launchMode wie singleTop wiederverwendet wird. In diesem Fall ist es erforderlich, handleDeepLink() in onNewIntent() manuell aufzurufen, 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.

Produktproben

Codelabs

Videos