Créer des liens profonds vers le contenu d'une application

Lorsqu'un clic sur un lien ou une requête programmatique appelle un intent d'URI Web, le système Android tente chacune des actions suivantes, dans l'ordre séquentiel, jusqu'à ce que la requête aboutisse:

  1. Si l'utilisateur en a désigné une, ouvrez l'application qui lui convient le mieux pour gérer l'URI.
  2. Ouvrez la seule application disponible pouvant gérer l'URI.
  3. Autoriser l'utilisateur à sélectionner une application dans une boîte de dialogue

Suivez les étapes ci-dessous pour créer et tester des liens vers votre contenu. Vous pouvez également utiliser l'assistant App Links dans Android Studio pour ajouter Android App Links.

Remarque : À partir d'Android 12 (niveau d'API 31), un intent Web générique ne résout une activité dans votre application que si celle-ci est approuvée pour le domaine spécifique contenu dans cet intent Web. Si votre application n'est pas approuvée pour le domaine, l'intent Web est associé à l'application de navigateur par défaut de l'utilisateur.

Ajouter des filtres d'intent pour les liens entrants

Pour créer un lien vers le contenu de votre application, ajoutez un filtre d'intent contenant ces éléments et valeurs d'attribut dans votre fichier manifeste:

<action>
Spécifiez l'action d'intent ACTION_VIEW afin que le filtre d'intent soit accessible depuis la recherche Google.
<data>
Ajoutez une ou plusieurs balises <data>, chacune représentant un format d'URI qui résout l'activité. La balise <data> doit au minimum inclure l'attribut android:scheme.

Vous pouvez ajouter d'autres attributs pour affiner le type d'URI accepté par l'activité. Par exemple, vous pouvez avoir plusieurs activités qui acceptent des URI similaires, mais qui se distinguent simplement par le nom du chemin. Dans ce cas, utilisez l'attribut android:path ou ses variantes pathPattern ou pathPrefix pour différencier l'activité que le système doit ouvrir pour les différents chemins d'URI.

<category>
Incluez la catégorie BROWSABLE. Cette étape est obligatoire pour que le filtre d'intent soit accessible depuis un navigateur Web. Sans ce lien, un clic sur un lien dans un navigateur ne permet pas d'accéder à votre application.

Incluez également la catégorie DEFAULT. Cela permet à votre application de répondre aux intents implicites. Sans cela, l'activité ne peut être lancée que si l'intent spécifie le nom du composant de votre application.

L'extrait de code XML suivant montre comment spécifier un filtre d'intent dans votre fichier manifeste pour les liens profonds. Les URI “example://gizmos” et “http://www.example.com/gizmos” renvoient tous deux à cette activité.

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

Notez que les deux filtres d'intent ne diffèrent que par l'élément <data>. Bien qu'il soit possible d'inclure plusieurs éléments <data> dans le même filtre, il est important de créer des filtres distincts lorsque vous avez l'intention de déclarer des URL uniques (par exemple, une combinaison spécifique de scheme et host), car plusieurs éléments <data> d'un même filtre d'intent sont en fait fusionnés pour prendre en compte toutes les variantes de leurs attributs combinés. Prenons l'exemple suivant :

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

Il peut sembler que cela n'accepte que https://www.example.com et app://open.my.app. Cependant, il accepte en réalité ces deux-là, plus ceux-ci : app://www.example.com et https://open.my.app.

Attention:Si plusieurs activités contiennent des filtres d'intent qui renvoient au même lien Android App Links validé, il n'y a aucune garantie quant à l'activité qui gère le lien.

Une fois que vous avez ajouté des filtres d'intent avec des URI pour le contenu des activités au fichier manifeste de votre application, Android peut acheminer vers votre application tout Intent contenant des URI correspondants au moment de l'exécution.

Pour en savoir plus sur la définition des filtres d'intent, consultez Autoriser d'autres applications à démarrer votre activité.

Lire les données des intents entrants

Une fois que le système a lancé votre activité via un filtre d'intent, vous pouvez utiliser les données fournies par Intent pour déterminer ce que vous devez afficher. Appelez les méthodes getData() et getAction() pour récupérer les données et l'action associées au Intent entrant. Vous pouvez appeler ces méthodes à tout moment du cycle de vie de l'activité, mais il est généralement préférable de le faire lors des premiers rappels tels que onCreate() ou onStart().

Voici un extrait qui montre comment récupérer des données à partir d'un Intent:

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();
}

Suivez ces bonnes pratiques pour améliorer l'expérience utilisateur:

  • Le lien profond doit rediriger directement les utilisateurs vers le contenu, sans invite, page interstitielle ni connexion. Assurez-vous que les utilisateurs peuvent voir le contenu de l'application même s'ils ne l'ont jamais ouverte. Vous pouvez inviter les utilisateurs à interagir par la suite ou lorsqu'ils ouvrent l'application depuis le Lanceur d'applications.
  • Suivez les conseils de conception décrits dans la section Navigation avec les options "Retour" et "Haut" afin que votre application réponde aux attentes des utilisateurs en matière de navigation vers l'arrière après avoir accédé à votre application via un lien profond.

Tester vos liens profonds

Vous pouvez utiliser Android Debug Bridge avec le gestionnaire d'activités (AM) pour vérifier que les URI de filtre d'intent que vous avez spécifiés pour les liens profonds renvoient l'activité appropriée dans l'application. Vous pouvez exécuter la commande adb sur un appareil ou un émulateur.

La syntaxe générale permettant de tester un URI de filtre d'intent avec adb est la suivante:

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

Par exemple, la commande ci-dessous tente d'afficher une activité d'application cible associée à l'URI spécifié.

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

La déclaration du fichier manifeste et le gestionnaire d'intent que vous avez définis ci-dessus définissent la connexion entre votre application et un site Web, et la procédure à suivre avec les liens entrants. Toutefois, pour que le système traite votre application comme le gestionnaire par défaut d'un ensemble d'URI, vous devez également lui demander de vérifier cette connexion. La leçon suivante explique comment mettre en œuvre cette validation.

Pour en savoir plus sur les intents et les liens d'application, consultez les ressources suivantes: