Deeplinks zu App-Inhalten erstellen

Wenn ein angeklickter Link oder eine programmatische Anfrage einen Web-URI-Intent aufruft, unternimmt das Android-System die folgenden Aktionen in sequenzieller Reihenfolge, bis die Anfrage erfolgreich ist:

  1. Öffnen Sie die bevorzugte App des Nutzers, die den URI verarbeiten kann, falls eine angegeben ist.
  2. Öffnen Sie die einzige verfügbare App, die den URI verarbeiten kann.
  3. Dem Nutzer erlauben, eine App aus einem Dialogfeld auszuwählen.

Führe die folgenden Schritte aus, um Links zu deinen Inhalten zu erstellen und zu testen. Du kannst auch den App-Link-Assistent in Android Studio verwenden, um Android-App-Links hinzuzufügen.

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

Intent-Filter für eingehende Links hinzufügen

Um einen Link zu deinen App-Inhalten zu erstellen, füge deinem Manifest einen Intent-Filter hinzu, der die folgenden Elemente und Attributwerte enthält:

<action>
Gib die Intent-Aktion ACTION_VIEW an, damit der Intent-Filter über die Google Suche erreicht werden kann.
<data>
Fügen Sie mindestens ein <data>-Tag hinzu, von dem 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 zu verfeinern. Es kann beispielsweise sein, dass mehrere Aktivitäten ähnliche URIs akzeptieren, sich aber nur durch den Pfadnamen unterscheiden. Verwenden Sie in diesem Fall das Attribut android:path oder dessen Varianten pathPattern oder pathPrefix, um zu unterscheiden, welche Aktivität das System für die verschiedenen URI-Pfade öffnen soll.

<category>
Geben Sie die Kategorie BROWSABLE an. Sie ist erforderlich, damit der Intent-Filter über einen Webbrowser aufgerufen werden kann. Andernfalls kann das Klicken auf einen Link in einem Browser nicht zur App weitergeleitet werden.

Nehmen Sie auch die Kategorie DEFAULT auf. So kann Ihre 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 in Ihrem Manifest einen Intent-Filter für Deeplinks angeben können. Die URIs “example://gizmos” und “http://www.example.com/gizmos” werden beide in diese 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>

Beachten Sie, dass sich die beiden Intent-Filter nur durch das Element <data> unterscheiden. Es ist zwar möglich, mehrere <data>-Elemente in denselben Filter aufzunehmen. Allerdings ist es wichtig, separate Filter zu erstellen, wenn eindeutige URLs deklariert werden sollen (z. B. eine bestimmte Kombination aus scheme und host), da mehrere <data>-Elemente im selben Intent-Filter zusammengeführt werden, um alle Varianten ihrer kombinierten Attribute zu berücksichtigen. Hier ein paar Beispiele:

<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ürden nur https://www.example.com und app://open.my.app unterstützt. Tatsächlich werden jedoch 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 verifizierten Android-App-Link aufgelöst werden, gibt es keine Garantie dafür, welche Aktivität den Link verarbeitet.

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

Weitere Informationen zum Definieren von Intent-Filtern findest du unter Andere Apps erlauben, deine Aktivitäten zu 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 dem eingehenden Intent zugeordnet sind. Sie können diese Methoden während des Lebenszyklus der Aktivität jederzeit aufrufen, im Allgemeinen sollten Sie dies jedoch während früher Callbacks wie onCreate() oder onStart() tun.

Das folgende Snippet 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 User Experience zu verbessern:

  • Über den Deeplink sollten Nutzer direkt und ohne Aufforderungen, Interstitial-Seiten oder Anmeldungen zum Inhalt gelangen. Achte darauf, dass Nutzer den App-Inhalt auch dann sehen können, wenn sie die App zuvor noch nie geöffnet haben. Es ist in Ordnung, Nutzer bei nachfolgenden Interaktionen oder beim Öffnen der App über den Launcher aufzufordern.
  • Beachte die Designleitfäden unter Navigation mit Zurück und Auf, damit deine App den Erwartungen der Nutzer an eine Rückwärtsnavigation entspricht, nachdem sie deine App über einen Deeplink aufgerufen haben.

Deeplinks testen

Sie können die Android Debug Bridge mit dem Aktivitätsmanager-Tool (am) verwenden, um zu testen, ob die Intent-Filter-URIs, die Sie für Deeplinks angegeben haben, zur richtigen App-Aktivität aufgelöst werden. Sie können den ADB-Befehl für ein Gerät oder einen 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 dem angegebenen URI zugeordnet ist.

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

Die Manifestdeklaration und der Intent-Handler, den du oben festgelegt hast, definieren die Verbindung zwischen deiner App und einer Website und was mit eingehenden Links geschehen soll. Damit das System Ihre Anwendung jedoch als Standard-Handler für eine Reihe von URIs behandelt, müssen Sie auch anfordern, dass das System diese Verbindung überprüft. 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: