Deeplinks zu App-Inhalten erstellen

Wenn ein angeklickter Link oder eine programmatische Anfrage einen Web-URI-Intent aufruft, führt das Android-System die folgenden Aktionen in der entsprechenden Reihenfolge durch, bis die Anfrage erfolgreich ist:

  1. Öffnen Sie die bevorzugte App des Nutzers, die den URI verarbeiten kann, falls eine vorgesehen ist.
  2. Öffnen Sie die einzige verfügbare App, die den URI verarbeiten kann.
  3. Nutzer dürfen eine App aus einem Dialogfeld auswählen.

Gehen Sie wie unten beschrieben vor, um Links zu Ihren Inhalten zu erstellen und zu testen. Sie können auch den App Links Assistant in Android Studio verwenden, um Android-App-Links hinzuzufügen.

Hinweis : Ab Android 12 (API-Level 31) wird ein generischer Web-Intent nur dann zu einer Aktivität in Ihrer App, wenn Ihre App für die Domain genehmigt ist, die in diesem Web Intent enthalten ist. Wenn Ihre Anwendung nicht für die Domain genehmigt wird, wird der Web Intent stattdessen zur Standard-Browseranwendung des Nutzers aufgelöst.

Intent-Filter für eingehende Links hinzufügen

Wenn du einen Link zu deinen App-Inhalten erstellen möchtest, füge in deinem Manifest einen Intent-Filter mit diesen Elementen und Attributwerten hinzu:

<action>
Gib die Intent-Aktion ACTION_VIEW an, damit der Intent-Filter über die Google Suche erreicht werden kann.
<data>
Fügen Sie ein oder mehrere <data>-Tags hinzu, von denen jedes ein URI-Format darstellt, das in die Aktivität aufgelöst wird. Das Tag <data> muss mindestens das Attribut android:scheme enthalten.

Sie können weitere Attribute hinzufügen, um den URI-Typ, den die Aktivität akzeptiert, weiter einzugrenzen. Beispiel: Sie haben möglicherweise mehrere Aktivitäten, die ähnliche URIs akzeptieren, sich aber nur anhand des Pfadnamens unterscheiden. Verwenden Sie in diesem Fall das Attribut android:path oder dessen pathPattern- oder pathPrefix-Varianten, um zu unterscheiden, welche Aktivität das System für verschiedene URI-Pfade öffnen soll.

<category>
Fügen Sie die Kategorie BROWSABLE hinzu. Dies ist erforderlich, damit der Intent-Filter über einen Webbrowser aufgerufen werden kann. Andernfalls kann das Klicken auf einen Link in einem Browser nicht zu Ihrer Anwendung aufgelöst werden.

Schließen Sie auch die Kategorie DEFAULT ein. Dadurch kann deine App auf implizite Intents reagieren. Andernfalls kann die Aktivität nur gestartet werden, wenn der Intent den Namen Ihrer App-Komponente angibt.

Das folgende XML-Snippet zeigt, wie Sie einen Intent-Filter in Ihrem Manifest für Deeplinks angeben können. Die URIs “example://gizmos” und “http://www.example.com/gizmos” werden beide zu dieser Aktivität aufgelöst.

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
        <!-- note that the leading "/" is required for pathPrefix-->
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "example://gizmos” -->
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

Die beiden Intent-Filter unterscheiden sich nur durch das Element <data>. Obwohl es möglich ist, mehrere <data>-Elemente in denselben Filter aufzunehmen, ist es wichtig, separate Filter zu erstellen, wenn Sie eindeutige URLs angeben möchten, z. B. eine bestimmte Kombination aus scheme und host. Denn mehrere <data>-Elemente im selben Intent-Filter werden zusammengeführt, um alle Varianten ihrer kombinierten Attribute zu berücksichtigen. Beispiel:

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

Es sieht so aus, als würde dies nur https://www.example.com und app://open.my.app unterstützen. Allerdings werden diese beiden sowie die folgenden unterstützt: app://www.example.com und https://open.my.app.

Achtung:Wenn mehrere Aktivitäten Intent-Filter enthalten, die zum selben bestätigten Android-App-Link aufgelöst werden, kann nicht garantiert werden, welche Aktivität die Verknüpfung verarbeitet.

Nachdem Sie Ihrem App-Manifest Intent-Filter mit URIs für Aktivitätsinhalte hinzugefügt haben, kann Android zur Laufzeit alle Intent mit übereinstimmenden URIs an Ihre App weiterleiten.

Weitere Informationen zum Definieren von Intent-Filtern finden Sie unter Andere Apps dürfen Ihre Aktivitäten starten.

Daten aus eingehenden Intents lesen

Sobald das System deine Aktivität über einen Intent-Filter startet, kannst du anhand der von Intent bereitgestellten Daten bestimmen, was gerendert werden muss. Rufen Sie die Methoden getData() und getAction() auf, um die Daten und die Aktion abzurufen, die mit der eingehenden Intent verknüpft sind. Sie können diese Methoden während des Lebenszyklus der Aktivität jederzeit aufrufen, sollten dies jedoch im Allgemeinen bei frühen Callbacks wie onCreate() oder onStart() tun.

Hier ist ein Snippet, das zeigt, wie Daten aus einem Intent abgerufen werden:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val action: String? = intent?.action
    val data: Uri? = intent?.data
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}

Befolgen Sie diese Best Practices, um die Nutzererfahrung zu verbessern:

  • Über den Deeplink sollten Nutzer direkt zum Inhalt gelangen – ohne Aufforderungen, Interstitial-Seiten oder Anmeldungen. Sorgen Sie dafür, dass Nutzer die App-Inhalte auch dann sehen können, wenn sie die App noch nie geöffnet haben. Sie dürfen Nutzer bei nachfolgenden Interaktionen oder beim Öffnen der App über den Launcher auffordern.
  • Folgen Sie der Designanleitung unter Navigation mit „Zurück und nach oben“, damit Ihre App den Erwartungen der Nutzer an die Rückwärtsnavigation entspricht, nachdem sie die App über einen Deeplink aufgerufen haben.

Deeplinks testen

Sie können die Android Debug Bridge mit dem Aktivitätsmanager (am) verwenden, um zu testen, ob die Intent-Filter-URIs, die Sie für Deeplinks angegeben haben, in die richtige App-Aktivität aufgelöst werden. Sie können den ADB-Befehl auf einem Gerät oder einem Emulator ausführen.

Die allgemeine Syntax zum Testen eines Intent-Filter-URI mit ADB lautet:

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>

Mit dem folgenden Befehl wird beispielsweise versucht, eine Ziel-App-Aktivität aufzurufen, die mit dem angegebenen URI verknüpft ist.

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d "example://gizmos" com.example.android

Die Manifestdeklaration und der Intent-Handler, den Sie oben festgelegt haben, definieren die Verbindung zwischen Ihrer App und einer Website sowie die Aktion für eingehende Links. Damit das System Ihre Anwendung jedoch als Standard-Handler für eine Reihe von URIs behandelt, müssen Sie auch beantragen, dass diese Verbindung vom System überprüft wird. In der nächsten Lektion wird erläutert, wie Sie diese Überprüfung implementieren.

Weitere Informationen zu Intents und App-Links finden Sie in den folgenden Ressourcen: