Cómo crear vínculos directos al contenido de la app

Cuando un vínculo al que se le hace clic o una solicitud programática invocan a un intent de URI web, el sistema Android intenta cada una de las siguientes acciones, en orden secuencial, hasta que la solicitud tiene éxito:

  1. Abre la app preferida del usuario que puede manejar el URI, si se designa uno.
  2. Abre la única app disponible que puede manejar el URI.
  3. Permite al usuario seleccionar una app desde un diálogo.

Sigue los pasos que aparecen a continuación para crear vínculos a tu contenido y probarlos. También puedes usar el Asistente de App Links en Android Studio para agregar Android App Links.

Nota: A partir de Android 12 (nivel de API 31), un intent web genérico se resuelve en una actividad de tu app solo si esta está aprobada para el dominio específico contenido en ese intent web. Si no se aprueba tu app para el dominio, el intent web se resuelve en la app del navegador predeterminada del usuario.

Cómo agregar filtros de intents para vínculos entrantes

Para crear un vínculo al contenido de tu app, agrega un filtro de intents que contenga estos elementos y valores de atributos en tu manifiesto:

<action>
Especifica la acción de intent ACTION_VIEW para que se pueda acceder al filtro de intents desde la Búsqueda de Google.
<data>
Agrega una o más etiquetas <data>, cada una de las cuales represente un formato de URI que se resuelva en la actividad. Como mínimo, la etiqueta <data> debe incluir el atributo android:scheme.

Puedes agregar más atributos para mejorar el tipo de URI que acepta la actividad. Por ejemplo, es posible que tengas varias actividades que acepten URI similares, pero que difieran simplemente en función del nombre de la ruta de acceso. En este caso, usa el atributo android:path o sus variantes pathPattern o pathPrefix para diferenciar la actividad que el sistema debe abrir según las diferentes rutas de URI.

<category>
Incluye la categoría BROWSABLE. Es necesario para que se pueda acceder al filtro de intents desde un navegador web. Sin ella, cuando se hace clic en un vínculo dentro de un navegador, no se redirecciona a tu app.

Incluye también la categoría DEFAULT. De esta manera, tu app puede responder a intents implícitos. Sin esto, la actividad solo se puede iniciar si el intent especifica el nombre del componente de la app.

En el siguiente fragmento XML, se muestra cómo puedes especificar un filtro de intents en tu manifiesto para vínculos directos. Los URIs “example://gizmos” y “http://www.example.com/gizmos” resuelven esta actividad.

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

Ten en cuenta que los dos filtros de intents solo difieren en el elemento <data>. Si bien es posible incluir varios elementos <data> en el mismo filtro, es importante que crees filtros separados cuando quieras declarar URLs únicas (como una combinación específica de scheme y host), ya que varios elementos <data> en el mismo filtro de intents se combinan para tener en cuenta todas las variaciones de sus atributos combinados. Por ejemplo, considera lo siguiente:

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

Puede parecer que esto solo admite https://www.example.com y app://open.my.app. Sin embargo, también es compatible con app://www.example.com y https://open.my.app.

Precaución: Si varias actividades contienen filtros de intents que se resuelven en el mismo Android App Link verificado, no hay garantía de qué actividad controla el vínculo.

Una vez que hayas agregado filtros de intents con URI para el contenido de actividades al manifiesto de tu app, Android podrá enrutar cualquier Intent que tenga URI coincidentes a tu app durante el tiempo de ejecución.

Para obtener más información sobre cómo definir filtros de intents, consulta Cómo permitir que otras apps inicien tu actividad.

Lee datos de intents entrantes

Una vez que el sistema inicia tu actividad mediante un filtro de intents, puedes usar los datos proporcionados por Intent para determinar lo que necesitas renderizar. Llama a los métodos getData() y getAction() para recuperar los datos y la acción asociados con el Intent entrante. Puedes llamar a estos métodos en cualquier momento del ciclo de vida de la actividad, pero generalmente debes hacerlo durante las primeras devoluciones de llamadas, como onCreate() o onStart().

A continuación, puedes ver un fragmento que muestra cómo recuperar datos de 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();
}

Sigue estas prácticas recomendadas para mejorar la experiencia del usuario:

  • El vínculo directo debe llevar a los usuarios directamente al contenido, sin avisos, páginas intersticiales ni accesos. Asegúrate de que los usuarios puedan ver el contenido de la app incluso si nunca antes la abrieron. Puedes solicitar a los usuarios que realicen interacciones posteriores o cuando abran la app desde el Selector.
  • Sigue las instrucciones de diseño que se describen en Navegación con los botones atrás y arriba para que tu app coincida con las expectativas de los usuarios de navegación hacia atrás después de que ingresan tu app a través de un vínculo directo.

Prueba tus vínculos directos

Puedes usar Android Debug Bridge con la herramienta Administrador de actividades (am) para probar que los URI del filtro de intents que especificaste para la vinculación directa resuelvan la actividad correcta de la app. Puedes ejecutar el comando adb en un dispositivo o emulador.

La sintaxis general para probar un URI de filtro de intents con adb es la siguiente:

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

Por ejemplo, el siguiente comando intenta ver una actividad de la app de destino asociada con el URI especificado.

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

La declaración de manifiesto y el controlador de intents que configuraste anteriormente definen la conexión entre tu app y un sitio web, y qué hacer con los vínculos entrantes. Sin embargo, para que el sistema trate a tu app como el controlador predeterminado para un conjunto de URI, también debes solicitar que el sistema verifique esta conexión. En la siguiente lección, se explica cómo implementar esta verificación.

Para obtener más información sobre intents y vínculos de apps, consulta los siguientes recursos: