Android muestra la diferencia entre intencionado y ermitaño.
1. Propósito
El concepto de diseño básico de Android es fomentar la reducción del acoplamiento entre componentes, por lo que Android proporciona intenciones.
Los Intents proporcionan un sistema de mensajería general que le permite pasar Intents entre su aplicación y otras aplicaciones para realizar acciones y generar eventos.
Intent se puede utilizar para activar los tres componentes principales de las aplicaciones de Android: Actividad, Servicio y BroadcastReceiver.
2. Intenciones explícitas e intenciones implícitas
Las intenciones se pueden dividir en intenciones explícitas e intenciones implícitas.
Intención explícita: llamar al método Intent.setComponent() o Intent.setClassName() o Intent.setClass() para especificar explícitamente el nombre del componente es una intención explícita. Una intención explícita especifica claramente que la intención debe. pasarse a qué componente.
Por ejemplo, abra una nueva actividad-otra actividad en MainActivity.
1.Intent Intent = new Intent();
2.intent .set componente(nuevo nombre del componente(actividad principal. esta, otra actividad. clase)); >
3. La segunda línea de código se puede cambiar a: intención. setclass (actividad principal. esta, otras actividades. clase);
4. También puede usar el constructor para especificar un componente: intención intención = nueva intención (actividad principal. esta, otra actividad. clase).
Las tres formas de expresar "intención clara" son equivalentes.
Intención implícita: una intención que no especifica explícitamente el nombre de un componente es una intención implícita.
El sistema Android encontrará el componente más apropiado para manejar la intención implícita en función de las acciones, categorías y datos (datos: URI y tipo de datos) establecidos en la intención.
Por ejemplo, la intención de hacer una llamada telefónica:
uri uri = uri .parse("tel:" código telefónico);
intención intención = nueva intención(intención .ACTION_CALL,uri);
¿Cómo encuentra Android el mejor componente para la intención implícita? Recuerde, cuando definimos la actividad, especificamos un filtro de intención. Los filtros de intención en realidad se utilizan para hacer coincidir intenciones implícitas. Cuando un filtro de intención prueba un objeto de intención, solo se hará referencia a tres aspectos: acción, datos (URI y tipo de datos) y categoría.
Prueba de acción (Prueba de acción)
El objeto de intención solo puede especificar un nombre de acción, mientras que el filtro puede enumerar varios nombres de acción. Si el objeto o filtro de intención no especifica ninguna acción, el resultado será el siguiente:
Si el filtro no especifica ninguna acción, se bloquearán todas las intenciones, por lo que todas las intenciones no pasarán la prueba. No voy a pasar este filtro.
lt filtro de intención gt lt! -null->lt/intent-filter gt
Por otro lado, los objetos intent que no especifican una acción pasan automáticamente esta prueba siempre que el filtro contenga al menos una acción.
Prueba de categorías (Prueba de categorías)
Para que una intención pase la prueba de coincidencia de categorías, las categorías en el objeto de intención deben coincidir con las categorías en el filtro.
Este filtro puede enumerar otras categorías, pero no puede omitir ninguna categoría en esta intención.
En principio, los objetos intent sin categorías siempre deben pasar la prueba de coincidencia, independientemente de lo que haya en el filtro. La mayoría de las veces esto es cierto.
Sin embargo, hay una excepción. Android trata todos los intents implícitos pasados a startActivity() como si contuvieran al menos una categoría: "Android.intent.category.default" (constante categoría_default).
Así que a la hora de personalizar una actividad, no creas que definir una acción es suficiente. De esta forma, cuando actives la actividad con startActivity(), siempre obtendrás un error.
La razón es que internamente requiere que coincida con la categoría de intención de Android.
Por lo tanto, una actividad que quiera recibir intenciones implícitas debe incluir "Android. Intención. Categoría. Predeterminado" en su filtro de intenciones.
(El filtrado con las configuraciones "android.intent.action.MAIN" y "android". Intent.Category.Launcher" son excepciones.)
Prueba de datos (Prueba de datos) p> p>
Cuando el URI en el objeto de intención se compara con el URI en el filtro, los componentes del URI también se comparan
Por ejemplo, si el filtro especifica solo un esquema, luego, también se comparan los componentes del esquema. Todos los URI pueden coincidir con este filtro;
Si el filtro especifica esquema, nombre de host pero ninguna parte de ruta, entonces todos los URI con el mismo esquema y nombre de host pueden coincidir con el filtro, independientemente de. su ruta;
Si el filtro especifica un esquema, nombre de host y ruta, solo los URI con el mismo esquema, nombre de host y ruta coincidirán con este filtro.
Por supuesto, en el. filter. La especificación de ruta puede contener comodines, por lo que solo se requiere una coincidencia parcial.
La prueba de datos compara el URI y el tipo de datos especificados en el objeto de intención y el filtro. p>
A. Solo filtro. Cuando el compilador no especifica ningún URI ni tipo de datos, un objeto de intención que no contiene ni un URI ni un tipo de datos puede pasar la prueba. objeto que contiene un URI pero ningún tipo de datos solo tiene su URI. La prueba solo pasa si coincide con un URI en un filtro que tampoco especifica un tipo de datos.
Esto suele suceder con URI como mailto. : y tel: que no involucran datos reales.
C. Un objeto de intención que contiene un tipo de datos pero no un URI puede pasar la prueba solo si el filtro enumera el mismo tipo de datos y no especifica un URI.
D. Si contiene tanto un URI como un tipo de datos. Un objeto de intención cuyo tipo coincida con el tipo enumerado en el filtro (o cuyo tipo de datos se pueda inferir del URI) pasa la prueba si. su URI coincide con el filtro. coincide con un URI en, o tiene un contenido: o archivo: URI, y el filtro no especifica un URI, entonces también pasa la prueba.
En otras palabras, si el filtro de un componente solo enumera. Un tipo de datos, se considera que el componente admite contenido: y archivo: datos
.