Deeplink für ein Ziel erstellen

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:

  1. Wählen Sie auf dem Tab Design des Navigationseditors das Ziel für um den Deeplink zu öffnen.
  2. Klicken Sie im Bereich Attribute unter Deeplinks auf +.
  3. 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 mit http://www.google.com als auch mit https://www.google.com
    • Platzhalter für Pfadparameter im Format {placeholder_name} stimmen mit einem oder mehreren überein Zeichen. Beispielsweise stimmt http://www.example.com/users/{id} mit http://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 Standardtyp String 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} Übereinstimmungen http://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} Übereinstimmungen http://www.example.com/users/4?arg2=28 oder http://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 mit http://www.example.com/users/4?extraneousParam=7, obwohl extraneousParam ist nicht im URI-Muster definiert.
  4. 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.

  5. Klicken Sie auf Hinzufügen. Ein Linksymbol wird über dem ausgewählten Ziel angezeigt, um anzugeben, dass es ein Deeplink zu aktivieren.

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

Produktproben

Codelabs

Videos