Skip to content

Most visited

Recently visited

navigation

Intents y filtros de intents

Una Intent es un objeto de acción que puedes usar para solicitar una acción de otro componente de la aplicación. Aunque las intents facilitan la comunicación entre los componentes de muchas maneras, existen tres casos de uso fundamentales:

Tipos de intents

Existen dos tipos de intents:

Cuando crea una intent explícita para iniciar una actividad o un servicio, la aplicación inicia inmediatamente el componente de la aplicación especificado en el objeto Intent.

Figura 1: Ilustración de la forma en que se entrega una intent implícita mediante el sistema para iniciar otra actividad. [1] La actividad A crea una Intent con una descripción de acción y la pasa a startActivity(). [2] El sistema Android busca en todas las apps un filtro de intents que coincida con la intent. Cuando se encuentra una coincidencia, [3] el sistema inicia la actividad coincidente (actividad B) invocando su método onCreate() y pasándolo a la Intent.

Cuando crea una intent implícita, el sistema Android busca el componente apropiado para iniciar comparando el contenido de la intent con los filtros de intents declarados en el archivo de manifiesto de otras aplicaciones en el dispositivo. Si la intent coincide con un filtro de intents, el sistema inicia ese componente y le entrega el objeto Intent. Si varios filtros de intents son compatibles, el sistema muestra un cuadro de diálogo para que el usuario pueda elegir la aplicación que se debe usar.

Un filtro de intents es una expresión en el archivo de manifiesto de una aplicación que especifica el tipo de intents que el componente podría recibir. Por ejemplo, declarando un filtro de intents para una actividad, permite que otras aplicaciones inicien directamente la actividad con cierto tipo de intent. Así mismo, si no declara ningún filtro de intent para una actividad, solo se la puede iniciar con una intent explícita.

Advertencia: Para garantizar que su aplicación sea segura, siempre use una intent explícita cuando inicie un Service y no declare filtros de intents para los servicios. El uso de una intent explícita para iniciar un servicio es un riesgo de seguridad porque no puede estar seguro de qué servicio responderá a la intent, y el usuario no puede ver qué servicio se inicia. A partir de Android 5.0 (nivel de API 21), el sistema arroja una excepción si llama abindService() con una intent implícita.

Creación de una intent

Un objeto Intent tiene información que el sistema Android usa para determinar qué componente debe iniciar (como el nombre exacto del componente o la categoría del componente que debe recibir la intent), además de información que el componente receptor usa para realizar la acción correctamente (por ejemplo, la acción que debe efectuar y los datos en los que debe actuar).

La información principal que contiene una Intent es la siguiente:

Nombre del componente
El nombre del componente que se debe iniciar.

Esto es opcional, pero es la información clave que hace que una intent sea explícita, lo que significa que la intent debe enviarse solamente al componente de la aplicación definido en el nombre del componente. Sin un nombre de componente, la intent es implícita y el sistema decide qué componente debe recibir la intent conforme la información restante que esta contiene (como la acción, los datos y la categoría, que se describen a continuación). Por lo que si necesita iniciar un componente específico en su aplicación, debe espceificar el nombre del componente.

Nota: Cuando inicies un Service, debes especificar siempre el nombre del componente. De lo contrario, no puedes estar seguro de qué servicio responderá a la intent, y el usuario no puede ver qué servicio se inicia.

Este campo del Intent es un objeto ComponentName, que puedes especificar con un nombre de clase completamente calificado del componente de destino, incluido el nombre del paquete de la aplicación. Por ejemplo, com.example.ExampleActivity. Puedes establecer el nombre del componente con setComponent(), setClass(), setClassName() o el constructor Intent.

Acción
Una string que especifica la acción genérica que se debe realizar (como ver o elegir).

En el caso de una intent de mensaje, esta es la acción que se realizó y se informa. La acción determina en gran parte cómo se estructura el resto de la intent, especialmente qué contienen los datos y los extras.

Puedes especificar tus propias acciones para que las usen las intents en tu aplicación (o para que las usen otras aplicaciones a fin de invocar componentes en tu aplicación); pero, usualmente, debes usar acciones constantes definidas por la clase Intent u otras clases del framework. Estas son algunas acciones comunes para iniciar una actividad:

ACTION_VIEW
Usa esta acción en una intent con startActivity() cuando tengas información que la actividad puede mostrar al usuario, como una foto para ver en una app de galería o una dirección para ver en una app de mapa.
ACTION_SEND
También se conoce como la intent de “compartir” y debes usarla en una intent con startActivity() cuando tengas información que el usuario puede compartir mediante otra app, como una app de correo electrónico o intercambio social.

Consulta la referencia de la clase Intent para conocer más constantes que definen las acciones genéricas. Otras acciones se definen en otras partes del framework de Android, como en Settings para las acciones que abren pantallas específicas en la aplicación de configuración del sistema.

Puedes especificar la acción de una intent con setAction() o un constructor Intent.

Si defines sus propias acciones, asegúrate de incluir el nombre del paquete de la aplicación como prefijo. Por ejemplo:

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
Datos
El URI (un objeto Uri) que hace referencia a los datos en los que se debe realizar la acción o el tipo de MIME de esos datos. El tipo de datos suministrado está generalmente determinado por la acción de la intent. Por ejemplo, si la acción es ACTION_EDIT, los datos deben contener el URI del documento que se debe editar.

Cuando se crea una intent, suele ser importante especificar el tipo de datos (su tipo de MIME), además del URI. Por ejemplo, una actividad que puede mostrar imágenes, probablemente no podrá reproducir un archivo de video, aunque los formatos del URI podrían ser similares. Por lo tanto, especificar el tipo de MIME de tus datos ayuda al sistema Android a encontrar el mejor componente para recibir la intent. No obstante, el tipo de MIME puede, a veces, inferirse del URI, en especial cuando los datos representan un URI content:. Esto indica que los datos están en el dispositivo y los controla un ContentProvider; esto hace que el tipo de MIME sea visible para el sistema.

Para establecer únicamente el URI de los datos, llama asetData(). Para establecer solamente el tipo de MIME, llama a setType(). Si es necesario, puedes establecer ambos explícitamente con setDataAndType().

Advertencia: Si deseas establecer tanto el URI como el tipo de MIME, no llames a setData()ni a setType() porque cada uno nulifica el valor del otro. Siempre usa setDataAndType() para establecer el URI y el tipo de MIME.

Categoría
Una string que contiene información adicional sobre el tipo de componente que la intent debe manejar. En una intent, se puede incluir la cantidad deseada de descripciones de categorías, pero la mayoría de las intents no requieren una categoría. Estas son algunas categorías comunes:
CATEGORY_BROWSABLE
La actividad de destino permite que la inicie un navegador web para mostrar datos a los que hace referencia un vínculo, como una imagen o un mensaje de correo electrónico.
CATEGORY_LAUNCHER
La actividad es la actividad inicial de una tarea y está enumerada en el lanzador de la aplicación del sistema.

Para conocer la lista completa de categorías, consulte la descripción de la clase Intent.

También puedes especificar una categoría con addCategory().

Las propiedades previamente indicadas (nombre de componente, acción, datos y categoría) representan las características definitorias de una intent. Mediante la lectura de estas propiedades, el sistema Android puede resolver qué componente de la aplicación debe iniciar.

Sin embargo, una intent puede tener información adicional que no afecta cómo se resuelve en un componente de la aplicación. Una intent también puede incluir lo siguiente:

Extras
Pares de valores clave que tienen información adicional necesaria para lograr la acción solicitada. Al igual que algunas acciones usan tipos particulares de URI de los datos, algunas acciones también usan extras particulares.

Puedes agregar datos de campos extra con varios métodos putExtra(), cada uno de los cuales acepta dos parámetros: el nombre clave y el valor. También puedes crear un objeto Bundle con todos los datos de campos extra y luego insertar el Bundle en el Intent con putExtras().

Por ejemplo, al crear una intent para enviar un correo electrónico con ACTION_SEND, puedes especificar el destinatario "para" con la clave EXTRA_EMAIL y especificar el "asunto" con la clave EXTRA_SUBJECT.

La clase Intent especifica muchas constantes EXTRA_* para tipos de datos estandarizados. Si tienes que declarar sus propias claves extra (para intents que recibe su aplicación), asegúrate de incluir el nombre del paquete de la aplicación como prefijo. Por ejemplo:

static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
Indicadores
Indicadores definidos en la clase Intent que funcionan como metadatos para la intent. Los indicadores pueden indicar al sistema Android cómo iniciar una actividad (por ejemplo, a qué tarea debe pertenecer la actividad) y cómo tratarla después del inicio (por ejemplo, si pertenece a la lista de actividades recientes).

Para obtener más información, consulte el método setFlags().

Ejemplo de una intent explícita

Una intent explícita es una intent que se usa para iniciar un componente específico de la aplicación, como una actividad o un servicio particular en la aplicación. Para crear una intent explícita, define el nombre de componente para el objeto Intent, todas las otras propiedades de la intent son opcionales.

Por ejemplo, si creaste un servicio en tu app denominado DownloadService, diseñado para descargar un archivo de la Web, puedes iniciarlo con el siguiente código:

// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);

El constructor Intent(Context, Class) proporciona Context a la aplicación ; y el componente, un objeto Class. De esta manera, la intent inicia explícitamente la clase DownloadService en la app.

Para obtener más información sobre la creación y el inicio de un servicio, consulte la guía Servicios.

Ejemplo de una intent implícita

Una intent implícita especifica una acción que puede invocar cualquier aplicación en el dispositivo que pueda realizar la acción. El uso de una intent implícita es útil cuando la aplicación no puede realizar la acción pero otras aplicaciones probablemente sí, y tu desearas que el usuario eligiera qué aplicación usar.

Por ejemplo, si tiene contenido que deseas que el usuario comparta con otras personas, crea una intent con la acción ACTION_SEND y agrega extras que especifiquen el contenido para compartir. Cuando llama a startActivity() con esa intent, el usuario puede elegir una aplicación mediante la cual compartir el contenido.

Advertencia: Es posible que un usuario no tenga ninguna aplicación para manejar la intent implícita que tu envías a startActivity(). Si esto sucede, la llamada fallará y la aplicación colapsará. Para verificar que una actividad recibirá la intent, llama a resolveActivity() en el objeto Intent. Si el resultado no es nulo, hay, al menos, una aplicación que puede manejar la intent y es seguro llamar astartActivity(). Si el resultado es nulo, no debes usar la intent y, si es posible, debes inhabilitar la característica que emite la intent.

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");

// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}

Nota: En este caso, el URI no se usa, pero el tipo de los datos de la intent se declara para especificar el contenido que tienen los extras.

Cuando se llama a startActivity(), el sistema examina todas las aplicaciones instaladas para determinar cuáles pueden manejar este tipo de intent (una intent con la acción ACTION_SEND y que tiene datos de texto/sin formato). Si solo hay una aplicación que puede manejarla, la aplicación se abre inmediatamente y se le entrega la intent. Si varias actividades aceptan la intent, el sistema muestra un cuadro de diálogo para que el usuario pueda elegir la aplicación que se debe usar.

Figura 2: Diálogo de selección.

Forzar un selector de apps

Cuando más de una aplicación responde a la intent implícita, el usuario puede seleccionar qué aplicación se debe usar y establecerla como la opción predeterminada para la acción. Esto es útil cuando se realiza una acción para la cual el usuario probablemente desea utilizar la misma aplicación de ahora en adelante, por ejemplo, al abrir una página web (los usuarios suelen preferir un solo navegador web).

No obstante, si responden varias aplicaciones a la intent y el usuario podría desear usar una aplicación diferente cada vez, debe mostrar explícitamente un cuadro de diálogo de selección. El cuadro de diálogo de selección obliga al usuario a seleccionar qué aplicación desea utilizar para la acción en cada ocasión (el usuario no puede seleccionar una aplicación predeterminada para la acción). Por ejemplo, cuando tu app realiza la acción de “compartir” con la acción ACTION_SEND, es posible que los usuarios deseen concretar la compartición usando una app diferente según la situación en la que estén. Por ello, debes usar siempre el cuadro de diálogo de selección, como se muestra en la figura 2.

Para mostrar el diálogo de selección, crea una Intent usando createChooser() y pásala a startActivity(). Por ejemplo:

Intent sendIntent = new Intent(Intent.ACTION_SEND);
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);

// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

Aquí se muestra un diálogo con una lista de apps que responden a la intent pasada al método createChooser(), con el texto proporcionado como título del diálogo.

Recepción de una intent implícita

Para informar las intents implícitas que puede recibir tu app, declara uno o más filtros para cada componente de la esta con un elemento <intent-filter> en el archivo de manifiesto. Cada filtro de intents especifica el tipo de intents que acepta según la acción, los datos y la categoría de la intent. El sistema entregará la intent implícita al componente de la aplicación solo si la intent puede pasar por uno de los filtros de intents.

Nota: Una intent explícita siempre se entrega al destino, independientemente de los filtros de intents que declare el componente.

Un componente de la aplicación debe declarar filtros independientes para cada tarea única que puede hacer. Por ejemplo, una actividad en una aplicación de galería de imágenes puede tener dos filtros: uno para ver una imagen y otro para editarla. Cuando la actividad comienza, inspecciona la Intent y decide cómo comportarse conforme la información en la Intent (como mostrar los controles del editor o no).

Cada filtro de intents está definido por un elemento <intent-filter> en el archivo de manifiesto de la app, anidado en el componente de la app correspondiente (como un elemento <activity>). En el <intent-filter>, puedes especificar el tipo de intents que se aceptará con uno o más de estos tres elementos:

<action>
Declara la acción de la intent aceptada, en el atributo name. El valor debe ser el valor de la string literal de una acción, no la constante de clase.
<data>
Declara el tipo de datos que se acepta, mediante el uso de uno o más atributos que especifican varios aspectos del URI de los datos (scheme, host, port, path, etc.) y el tipo de MIME.
<category>
Declara la categoría de la intent aceptada, en el atributo name. El valor debe ser el valor de la string literal de una acción, no la constante de clase.

Nota: Para recibir intents implícitas, debe incluir la categoría CATEGORY_DEFAULT en el filtro de intents. Los métodos startActivity() y startActivityForResult() tratan todas las intents como si pertenecieran a la categoría CATEGORY_DEFAULT. Si no declara esta categoría en el filtro de intents, no se aplicará ninguna intent implícita a la actividad.

Por ejemplo, a continuación se muestra una declaración de actividad con un filtro de intents para recibir una intent ACTION_SEND cuando el tipo de datos es un texto:

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

Estará bien crear un filtro que incluya más de una instancia de <action>, <data> o <category>. Si no lo haces, simplemente debes estar seguro de que el componente pueda manejar todos los tipos de combinaciones de esos elementos de filtro.

Cuando desees manejar múltiples tipos de intents, pero solo en combinaciones específicas de tipos de acciones, datos y categorías, debes crear varios filtros de intents.

Una intent implícita se prueba con un filtro comparando la intent con cada uno de los tres elementos. Para que se la entregue al componente, la intent debe pasar las tres pruebas. Si no pasa tan solo una de ellas, el sistema Android no la entregará al componente. Sin embargo, como un componente puede tener varios filtros de intents, una intent que no pase por el filtro de un componente podría pasar por otro filtro. Se proporciona más información sobre la manera en que el sistema resuelve las intents en la siguiente sección sobre resolución de intents.

Advertencia: Para evitar ejecutar accidentalmente el Service de otra aplicación, siempre usa una intent explícita cuando inicies tu propio servicio y no declares filtros de intents para el servicio.

Nota: Para todas las actividades, debes declarar los filtros de intents en el archivo de manifiesto. No obstante, los filtros para los receptores de mensajes se pueden registrar dinámicamente llamando a registerReceiver(). Puede anular el registro del receptor con unregisterReceiver(). Hacerlo permite que la aplicación espere mensajes específicos solo durante un plazo especificado mientras la aplicación está ejecutándose.

Ejemplos de filtros

Para comprender mejor algunos de los comportamientos de los filtros de intents, observa el siguiente fragmento de código del archivo de manifiesto de una aplicación de intercambio social.

<activity android:name="MainActivity">
    <!-- This activity is the main entry, should appear in app launcher -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name="ShareActivity">
    <!-- This activity handles "SEND" actions with text data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <action android:name="android.intent.action.SEND_MULTIPLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.google.panorama360+jpg"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="video/*"/>
    </intent-filter>
</activity>

La primera actividad, MainActivity, es el punto de entrada principal de la app (la actividad que se abre cuando el usuario lanza inicialmente la app con el ícono lanzador):

Estos dos se deben emparejar para que la actividad aparezca en el lanzador de la aplicación.

La segunda actividad, ShareActivity, tiene como objetivo facilitar el intercambio de texto y contenido de medios. Aunque los usuarios pueden ingresar a esta actividad navegando hasta ella desde la MainActivity, también pueden ingresar a la ShareActivity directamente desde otra app que emita una intent implícita que coincida con uno de los dos filtros de intents.

Nota: El tipo de MIME, application/vnd.google.panorama360+jpg, es un tipo de datos especial que especifica fotos panorámicas que puedes manejar con las Google Panorama API.

Uso de una intent pendiente

Un objeto PendingIntent es un contenedor de un objeto Intent. El objetivo principal de un objeto PendingIntent es otorgar permiso a una aplicación externa para usar la Intent contenida como si se ejecutara desde un proceso de su propia aplicación.

Estos son algunos de los casos de uso principales de una intent pendiente:

Como cada objeto Intent está diseñado para ser manejado por un tipo específico de componente de la aplicación (Activity, Service o BroadcastReceiver), se debe tener la misma consideración al crear una PendingIntent. Cuando use una intent pendiente, la aplicación no ejecutará la intent con una llamada como startActivity(). En cambio, debe declarar el tipo de componente deseado cuando cree la PendingIntent llamando al método creador respectivo:

A menos que la aplicación esté recibiendo intents pendientes de otras aplicaciones, los métodos indicados arriba para crear una PendingIntent probablemente sean los únicos métodos PendingIntent que necesitarás.

Cada método toma el Context actual de la aplicación, la Intent que desea encapsular y uno o más indicadores que especifican cómo se debe usar la intent (por ejemplo, si se la puede usar más de una vez).

Se proporciona más información sobre el uso de intents pendientes con la documentación para cada caso de uso, como en las guías de Notifications y App Widgets API.

Resolución de intents

Cuando el sistema recibe una intent implícita para iniciar una actividad, busca la mejor actividad para la intent mediante la comparación de la intent con los filtros de intents basándose en tres aspectos:

En las siguientes secciones se describe la manera de hacer coincidir las intents con los componentes apropiados en cuanto a la forma de declarar el filtro de intents en un archivo de manifiesto de una app.

Prueba de acción

Para especificar las acciones de intents aceptadas, un filtro de intents puede declarar un número de elementos <action> de cero en adelante. Por ejemplo:

<intent-filter>
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.VIEW" />
    ...
</intent-filter>

Para pasar el filtro, la acción especificada en la Intent debe coincidir con una de las acciones indicadas en el filtro.

Si el filtro no enumera ninguna acción, no hay nada con qué establecer la coincidencia, por lo que ninguna de las intents pasa la prueba. Sin embargo, si una Intent no especifica una acción, pasará la prueba (si el filtro contiene, al menos, una acción).

Prueba de categoría

Para especificar las categorías de intents aceptadas, un filtro de intents puede declarar un número de elementos <category> de cero en adelante. Por ejemplo:

<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    ...
</intent-filter>

Para que una intent pase una prueba de categoría, cada categoría en la Intent debe coincidir con la categoría que figura en el filtro. No es necesario que suceda la situación inversa (el filtro de intents puede declarar más categorías que las que se especifican en la Intent y la Intent pasará la prueba). Por lo tanto, una intent sin categorías siempre debería pasar esta prueba, independientemente de qué categorías estén declaradas en el filtro.

Nota: Android aplica automáticamente la categoría CATEGORY_DEFAULT a todas las intents implícitas pasadas a startActivity() y startActivityForResult(). Por ello, si deseas que tu actividad reciba intents implícitas, debes incluir una categoría para "android.intent.category.DEFAULT" en los filtros de intents (como se muestra en el ejemplo de <intent-filter> anterior).

Prueba de datos

Para especificar datos de intents aceptadas, un filtro de intents puede declarar un número de elementos <data> de cero en adelante. Por ejemplo:

<intent-filter>
    <data android:mimeType="video/mpeg" android:scheme="http" ... />
    <data android:mimeType="audio/mpeg" android:scheme="http" ... />
    ...
</intent-filter>

Cada elemento <data> puede especificar una estructura de URI y tipo de datos (tipo de medios de MIME). Hay atributos separados (scheme, host, port y path) para cada parte del URI:

<scheme>://<host>:<port>/<path>

Por ejemplo:

content://com.example.project:200/folder/subfolder/etc

En este URI, el esquema es content, el host com.example.project, el puerto 200 y la ruta folder/subfolder/etc.

Cada uno de los atributos es opcional en un elemento <data>, pero existen dependencias lineales:

Cuando el URI de una intent se compara con una especificación de URI en un filtro, solo se lo compara con las partes del URI que se incluyen en el filtro. Por ejemplo:

Nota: La especificación de una ruta de acceso puede contener un asterisco (*) comodín para requerir solamente una coincidencia parcial del nombre de la ruta.

La prueba de datos compara tanto el URI como el tipo de MIME en la intent con el URI y el tipo de MIME especificados en el filtro. Las reglas son las siguientes:

  1. Una intent que no contiene ni un URI ni un tipo de MIME pasa la prueba solo si el filtro no especifica ningún URI ni tipo de MIME.
  2. Una intent que contiene un URI pero no un tipo de MIME (ni explícitamente ni que se pueda inferir del URI) pasa la prueba solo si el URI coincide con el formato de URI del filtro y si el filtro tampoco especifica un tipo de MIME.
  3. Una intent que contiene un tipo de MIME pero no un URI pasa la prueba solo si el filtro enumera el mismo tipo de MIME y no especifica un formato de URI.
  4. Una intent que contiene tanto un URI como un tipo de MIME (explícitamente o que se pueda inferir del URI) pasa la parte de tipo de MIME de la prueba solo si ese tipo coincide con el tipo enumerado en el filtro. Pasa la parte del URI de la prueba si este coincide con un URI del filtro o si tiene un URI content: o file: y el filtro no especifica uno. Es decir, se supone que un componente admite datos content: y file: si el filtro solo indica un tipo de MIME.

Esta última regla, la regla (d), refleja la expectativa de que los componentes estén disponibles para obtener datos locales de un archivo o proveedor de contenido. Por lo tanto, los filtros pueden enumerar solo un tipo de datos y no deben explicitar el nombre de los esquemas content: y file:. Este es un caso típico. Un elemento <data> como el siguiente, por ejemplo, indica a Android que el componente puede obtener datos de imagen de un proveedor de contenido y mostrarlos:

<intent-filter>
    <data android:mimeType="image/*" />
    ...
</intent-filter>

Como la mayoría del los datos son proporcionados por proveedores de contenido, los filtros que especifican un tipo de datos pero no un URI son, tal vez, los más comunes.

Otra configuración común es aquella en la que los filtros tienen un esquema y un tipo de datos. Por ejemplo, un elemento <data> como el siguiente indica a Android que el componente puede recuperar datos de video de la red para realizar la acción:

<intent-filter>
    <data android:scheme="http" android:type="video/*" />
    ...
</intent-filter>

Coincidencias de intents

Se establecen coincidencias de las intents con filtros de intents no solo para detectar un componente de destino que se debe activar, sino también para detectar algo sobre el conjunto de componentes del dispositivo. Por ejemplo, la app de página principal completa el lanzador de la aplicación encontrando todas las actividades con filtros de intents que especifiquen la acción ACTION_MAIN y la categoría CATEGORY_LAUNCHER.

Tu app puede usar la coincidencia de intents de una manera similar. El PackageManager tiene un conjunto de métodos query...() que muestran todos los componentes que pueden aceptar una intent específica, al igual que una serie similar de métodos resolve...() para determinar el mejor componente a fin de responder a la intent. Por ejemplo, queryIntentActivities() muestra una lista de todas las actividades que pueden realizar la intent pasada como argumento y queryIntentServices() muestra una lista similar de servicios. Ninguno de los métodos activa los componentes; solo enumeran los que pueden responder. Existe un método similar, queryBroadcastReceivers(), para receptores de mensajes.

This site uses cookies to store your preferences for site-specific language and display options.

Hooray!

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.