Intent Filter es una declaración en AndroidManifest.xml que indica al sistema qué intenciones implícitas puede manejar un componente de la aplicación. Según la Guía para desarrolladores de Android, el filtro contiene action, category y data, con base en los cuales el sistema enruta llamadas de otras aplicaciones y eventos del sistema. El desarrollo Android utiliza Intent Filter como mecanismo principal de acoplamiento débil entre componentes de diferentes aplicaciones.
Puntos clave
Intent Filter es un elemento de configuración de una aplicación Android que informa al sistema sobre la capacidad del componente para manejar ciertos tipos de intenciones implícitas. A diferencia de los Intents explícitos que especifican una clase concreta, los Intents implícitos contienen solo una descripción de la acción requerida, y el sistema mismo encuentra un componente adecuado basándose en los filtros registrados.
Los filtros se declaran dentro de un componente — Activity, Service o BroadcastReceiver — en el archivo AndroidManifest.xml. Cada filtro puede contener múltiples elementos action, category y data. Un componente puede tener un número ilimitado de Intent Filters, cada uno describiendo un escenario de manejo diferente.
Intent Filter implementa el principio de acoplamiento débil entre componentes de aplicaciones. La aplicación A no tiene que conocer la existencia de la aplicación B — simplemente envía un Intent con la descripción de la acción, y el sistema lo enruta según los filtros. Este mecanismo subyace en Share Sheet, la selección del navegador y el manejo de deep links.
Los Intents explícitos especifican una clase de componente concreta para iniciar. Se utilizan para la navegación interna dentro de una sola aplicación cuando el desarrollador sabe exactamente qué Activity debe abrirse. Los Intents implícitos contienen solo una descripción de la acción, y el componente lo determina el sistema dinámicamente.
Intent Filter funciona exclusivamente con Intents implícitos. Si un Intent especifica una clase concreta, el sistema ignora todos los filtros e inicia el componente indicado directamente. Los filtros se verifican solo al resolver llamadas implícitas, lo que los convierte en un elemento clave de la interacción entre aplicaciones.
| Característica | Intent explícito | Intent implícito |
|---|---|---|
| Componente | Especificado explícitamente (className) | Determinado por el sistema |
| Intent Filter | No requerido | Requerido |
| Ejemplo | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse(“ https://example.com”)) |
| Seguridad | Mayor (sin intercepción) | Menor (posibles conflictos) |
Cada Intent Filter consta de tres grupos de elementos — action, category y data — cuya combinación determina qué Intents recibirá el componente. Un filtro se considera cumplido si el Intent coincide con al menos un elemento de cada grupo.
Action describe la acción que se realiza — ver, editar, enviar. Category añade un contexto de procesamiento adicional — por ejemplo, la capacidad de iniciarse desde el navegador. Data define el formato de la información manejada mediante URI o tipo MIME.
Ejemplo de un Intent Filter para una Activity que abre enlaces a perfiles de usuario. El filtro incluye los tres grupos de elementos para un enrutamiento preciso.
<activity android:name=".ProfileActivity">
<intent-filter>
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="myapp"
android:host="profile" />
</intent-filter>
</activity>
Tenga en cuenta la especificación obligatoria de category DEFAULT — sin ella el sistema no transmitirá Intents implícitos al componente. La categoría BROWSABLE se añade si el enlace debe manejarse desde un navegador.
Un deep link en Android se configura mediante un Intent Filter con action VIEW y una etiqueta data que contiene el esquema, host y ruta. Al seguir un enlace como myapp://profile/42, el sistema encuentra una Activity con un filtro coincidente y la inicia con el URI pasado. Es importante configurar correctamente pathPrefix, pathPattern o path para una coincidencia exacta.
A partir de Android 6 (API 23) se agregó soporte para App Links — deep links verificados mediante HTTPS. Los App Links usan el mismo Intent Filter pero con verificación adicional del dominio a través de Digital Asset Links. Después de la verificación, el sistema abre automáticamente la aplicación sin un diálogo de selección.
Ejemplo de un filtro para App Link con verificación mediante enlace HTTPS. En este caso, el esquema siempre es https y el host coincide con el dominio especificado en Digital Asset Links.
<intent-filter android:autoVerify="true">
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="example.com"
android:pathPrefix="/profile" />
</intent-filter>
El atributo autoVerify indica al sistema que verifique los Digital Asset Links cuando se instala la aplicación. Si la verificación pasa correctamente, la aplicación se convierte automáticamente en el controlador predeterminado para el dominio y rutas especificados.
Después de que el sistema ha seleccionado un componente para manejar el Intent, el desarrollador debe extraer los datos del intent entrante dentro del componente destino. Para Activity se usa el método getIntent() en onCreate(); para BroadcastReceiver, el método onReceive(), donde Intent se pasa como parámetro.
La extracción de datos incluye obtener la action para determinar el tipo de operación, data para el URI y parámetros extra para información adicional. Cada uno de estos elementos puede estar ausente, por lo que es obligatoria una verificación de null antes de usarlos.
Ejemplo de manejo de un deep link entrante en una Activity en Kotlin. El código extrae el URI del Intent y toma decisiones de navegación basadas en el host y la ruta.
class ProfileActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val uri = intent?.data
if (uri?.host == "profile") {
val userId = uri.lastPathSegment
loadProfile(userId)
}
}
}
Se recomienda usar el operador safe call para verificar intent y data por null, ya que la actividad puede iniciarse sin un deep link entrante. También debe verificar host y pathSegment por null antes de usarlos en la navegación.
Si varias aplicaciones han registrado un Intent Filter que coincide con el mismo Intent implícito, el sistema muestra al usuario un diálogo de selección. El usuario puede seleccionar una aplicación para uso único o establecer un controlador predeterminado. A partir de Android 10, el diálogo de selección se muestra solo en la primera llamada, después de lo cual el sistema recuerda la elección del usuario.
Para gestionar la prioridad se utiliza el atributo android:priority en la etiqueta intent-filter. Cuanto mayor sea el valor, mayor prioridad tiene el componente al resolver conflictos. Sin embargo, la prioridad no funciona para filtros de diferentes aplicaciones — en este caso siempre se muestra un diálogo de selección si ninguna aplicación está establecida como predeterminada.
El desarrollador puede llamar programáticamente al diálogo de selección mediante Intent.createChooser(), pasando el Intent destino y un título. Esto es útil cuando una aplicación quiere ofrecer explícitamente al usuario que elija un controlador, incluso si hay una aplicación predeterminada establecida. Por ejemplo, al enviar imágenes a redes sociales mediante ACTION_SEND con createChooser garantiza que se muestre el diálogo independientemente de la configuración predeterminada.
Uno de los errores más comunes es la ausencia de la categoría DEFAULT en el Intent Filter. Los desarrolladores copian la configuración de ejemplos pero olvidan añadir esta categoría, como resultado la Activity no recibe Intents implícitos. El sistema simplemente no ve el filtro para llamadas implícitas, aunque los Intents explícitos siguen funcionando.
El segundo error común es la especificación incorrecta de scheme en la etiqueta data sin un URI completo. Si solo se especifica el esquema pero no el host, el filtro aceptará todos los enlaces con este esquema de cualquier fuente, lo que puede provocar llamadas no deseadas desde fuentes no confiables. Se recomienda especificar siempre al menos scheme y host.
El tercer error es la ausencia de verificación de null para intent.data en el código de la Activity. Si la Activity se inicia no a través de un deep link sino de forma estándar desde el lanzador, el Intent no contiene un URI. Acceder a intent.data sin verificación provoca una NullPointerException y bloquea la aplicación. Siempre use intent?.data?.toString() con el operador safe call.
Preguntas frecuentes
Sí, la categoría DEFAULT es obligatoria para recibir Intents implícitos. Sin ella, el sistema no transmitirá llamadas implícitas al componente, y el Intent Filter solo funcionará para Intents explícitos, que de todos modos no verifican filtros.
No hay límite. Una Activity puede contener cualquier cantidad de Intent Filters. Cada filtro describe un escenario de manejo diferente, por ejemplo un filtro para deep links, otro para manejo de archivos, un tercero para Share Sheet.
Intent Filter es un mecanismo general para manejar Intents implícitos. App Link es un caso especial de Intent Filter con verificación mediante Digital Asset Links, que asigna automáticamente la aplicación como controlador predeterminado para enlaces HTTPS en un dominio especificado.
Sí, Intent Filter se puede declarar no solo para Activity, sino también para Service y BroadcastReceiver. Para Service permite ejecutar un servicio en segundo plano desde otras aplicaciones, para BroadcastReceiver — recibir mensajes de difusión del sistema.
El tipo MIME se especifica en la etiqueta data mediante el atributo mimeType. El filtro determina qué tipos de datos puede manejar el componente — por ejemplo, image/* para todas las imágenes o text/plain solo para texto plano. Los tipos MIME pueden combinarse con esquemas URI.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también