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, sofern eine solche App angegeben ist.
  2. Öffnen Sie die einzige verfügbare App, die den URI verarbeiten kann.
  3. Dem Nutzer muss es möglich sein, in einem Dialogfeld eine App auszuwählen.

Führe die folgenden Schritte aus, um Links zu deinen Inhalten zu erstellen und zu testen. Sie können auch den App-Link-Assistenten 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 App nicht für die Domain genehmigt ist, wird der Web-Intent stattdessen an die Standardbrowser-App des Nutzers weitergeleitet.

Intent-Filter für eingehende Links hinzufügen

Wenn Sie einen Link zu Ihren App-Inhalten erstellen möchten, fügen Sie Ihrem Manifest einen Intent-Filter mit den folgenden Elementen und Attributwerten hinzu:

<action>
Geben Sie die Intent-Aktion vom Typ ACTION_VIEW an, damit der Intent-Filter über die Google Suche aufgerufen 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 <data>-Tag muss mindestens das android:scheme-Attribut 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>
Fügen Sie die Kategorie BROWSABLE hinzu. Er ist erforderlich, damit der Intent-Filter über einen Webbrowser zugänglich ist. Andernfalls kann ein Klick auf einen Link in einem Browser nicht zu Ihrer App weiterleiten.

Geben Sie auch die Kategorie DEFAULT an. So kann Ihre App auf implizite Intents reagieren. Andernfalls kann die Aktivität nur gestartet werden, wenn im Intent der Name Ihrer App-Komponente angegeben ist.

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” führen beide zu dieser Aktivität.

<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, aber Sie sollten separate Filter erstellen, wenn Sie eindeutige URLs angeben möchten (z. B. eine bestimmte Kombination aus scheme und host). Mehrere <data>-Elemente im selben Intent-Filter werden nämlich zusammengeführt, um alle Varianten der kombinierten Attribute zu berücksichtigen. Sehen Sie sich zum Beispiel Folgendes an:

<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 auf denselben bestätigten Android App-Link verweisen, kann nicht garantiert werden, welche Aktivität den Link verarbeitet.

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

Weitere Informationen zum Definieren von Intent-Filtern finden Sie unter Starten einer Aktivität durch andere Apps erlauben.

Daten aus eingehenden Intents lesen

Sobald das System deine Aktivität über einen Intent-Filter gestartet hat, kannst du anhand der von Intent bereitgestellten Daten festlegen, was gerendert werden muss. Rufe 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 jederzeit während des Lebenszyklus der Aktivität aufrufen. Sie sollten dies jedoch in der Regel bei frühen Rückrufen wie onCreate() oder onStart() tun.

Im folgenden Snippet wird gezeigt, 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();
}

Beachten Sie die folgenden Best Practices, um die Nutzerfreundlichkeit 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 um Eingaben zu bitten.
  • Folgen Sie den Designrichtlinien unter Navigation mit „Zurück“ und „Oben“, damit Ihre App die Erwartungen der Nutzer an die Rückwärtsnavigation erfüllt, nachdem sie Ihre 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-URIs 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 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 erfahren Sie, wie Sie diese Bestätigung implementieren.

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