Las intenciones
Una intención representa la voluntad de realizar alguna acción o tarea, como realizar una llamada de teléfono o visualizar una página web. Una intención nos permite lanzar una actividad o servicio de nuestra aplicación o de una aplicación diferente. Tienen un gran potencial en Android, por lo que resulta importante conocerlas y dominarlas.
video[Tutorial] Las intenciones en Android
Existen dos tipos de intenciones:>
- Intenciones explícitas: se indica exactamente el componente a lanzar. Su utilización típica es la de ir ejecutando los diferentes componentes internos de una aplicación. Por ejemplo, desde la actividad Asteroides o MisLugares lanzamos AcercaDeActivity por medio de una intención explicita.
- Intenciones implícitas: pueden solicitar tareas abstractas, como “quiero tomar una foto” o “quiero enviar un mensaje”. Además las intenciones se resuelven en tiempo de ejecución, de forma que el sistema mirará cuantos compomentes han registrado la posibilidad de ejecutar ese tipo deintención. Si encuentra varias el sistema puede preguntar al usuario el componente que prefiere utilizar.
Además, como se ha estudiado en el apartado "Comunicación entre actividades" las intenciones ofrecen un servicio de paso de mensajes que permite interconectar datos entre componentes.>
En concreto se utilizan intenciones cada vez que queramos:
-
Lanzar una actividad (startActivity() y startActivityForResult())
-
Lanzar un servicio (startService())
-
Lanzar un anuncio de tipo broadcast (sendBroadcast())
-
Conectarnos con un servicio (bindService())
En muchas ocasiones una intención no será inicializada por la aplicación, si no por el sistema, por ejemplo, cuando pedimos visualizar una página Web. En otras ocasiones será necesario que la aplicación inicialice su propia intención. Para ello se creará un objeto de la clase Intent.
Cuando se crea una Intención (es decir, se instancia un objeto de tipo Intent) esta contiene información de interés para que el sistema trate adecuadamente la intención o para el componente que recibe la intención. Puede incluir la siguiente información:>
Nombre del componente: Identificamos el componente que queremos lanzar con la intención. Hay que utilizar el nombre de clase totalmente cualificado que queremos lanzar (org.example.asteroides.AcercaDeActivity). El nombre del componente es opcional. En caso de no indicarse se utilizará otra información de la intención para obtener el componente a lanzar. A este tipo de intenciones se les conocía como intenciones explícitas.
Acción: Una cadena de caracteres donde indicamos la acción a realizar o en caso de un Receptor de anuncios (Broadcast receiver), la acción que tuvo lugar y que queremos reportar. La clase Intent define una serie de constantes para acciones genéricas que se enumeran a continuación:
Constante |
componente |
Acción |
|
Actividad |
Inicializa una llamada de teléfono. |
|
Actividad |
Visualiza datos para que el usuario los edite. |
|
Actividad |
Arranca como actividad principal de una tarea. (sin datos de entrada y sin devolver datos) |
|
Actividad |
Sincroniza datos en un servidor con los datos de un dispositivo móvil. |
|
Receptor de anuncios |
Advertencia de bateria baja. |
|
Receptor de anuncios |
Se han conectado o desconectado los auriculares. |
|
Receptor de anuncios |
Se ha activado la pantalla. |
|
Receptor de anuncios |
Se cambia la selección de zona horaria. |
Algunas acciones estándar de las Intenciones
También puedes definir tus propias acciones. En este caso has de indicar el paquete de tu aplicación como prefijo. Por ejemplo: org.example.mislugares.MUESTRA_MAPA_LUGARES
Categoría: Complementa a la acción. Indica información adicional sobre el tipo de componente que ha de ser lanzado. El número de categoríaspuede ampliarse arbitrariamente. No obstante, en la clase Intent se definen una serie de categorías genéricas que podemos utilizar.
Constante |
Significado |
|
La actividad lanzada puede ser invocada con seguridad por el navegador para mostrar los datos referenciados por un enlace (por ejemplo, una imagen o un mensaje de correo electrónico). |
|
La actividad muestra la pantalla de inicio, la primera pantalla que ve el usuario cuando el dispositivo está encendido o cuandose presiona la tecla Home. |
|
La actividad puede ser la actividad inicial de una tarea y se muestra en el lanzador de aplicaciones de nivel superior. |
|
La actividad a lanzar es un panel de preferencias. |
Algunas categorías estándar de las Intenciones
Una categoría suele utilizarse junto con una acción para aportar información adicional. Por ejemplo, indicaremos ACTION_MAIN a las actividades que pueden utilizarse como puntos de entrada de una aplicación. Indicaremos además CATEGORY_LAUNCHER para que la actividad sea mostrada en la pantalla de inicio.
Datos: Referencia a los datos con los que trabajaremos. Hay que expresar estos datos por medio de una URI (el mismo concepto ampliamente utilizado en Internet). Ejemplos de URIs son: tel:963228525, http://www.androidcurso.com, content://call_log/calls… En muchos casos resulta importante saber el tipo de datos con el que se trabaja. Con este propósito se indica el tipo MIME asociado a la URI, es decir, se utiliza el mismo mecanismo que en Internet. Ejemplos de tipos MIME son text/xml, image/jpeg, audio/mp3…
Extras: Información adicional que será recibida por el componente lanzado. Está formada por un conjunto de pares variable/valor. Estas colecciones de valores se almacenan en un objeto de la clase Bundle. Su utilización ha sido descrita en la sección Comunicación entre actividades. Recordemos cómo se introducían estos valores en un Intent.
intent.putExtra("usuario", "Pepito Perez")
intent.putExtra("edad", 27);
En el apartado "Creación de nuevas actividades" hemos aprendido a lanzar una actividad de forma explícita utilizando el constructor Intent(Context contexto, Class<?> clase).
Por ejemplo, para lanzar la actividad AcercaDeActivity escribíamos:
Intent intent = new Intent(this, AcercaDeActicity.class);
startActivity(intent);
Para lanzar una actividad de forma implícita podemos usar el constructor Intent(String action, Uri uri). Por ejemplo:
Intent intent = new Intent(Intent.ACTION_DIAL,
URI.parse("tel:962849347");
startActivity(intent);
También se puede utilizar startActivityForResult() si esperamos que la actividad nos devuelva datos.
Ejercicio: Uso de intenciones implícitas
1. Crea un nuevo proyecto con nombre Intenciones y tipo Empty Activity.
2. El Layout de la actividad inicial ha de estar formado por cinco botones, tal y como se muestra a continuación:
3. Abre la actividad principal e incorpora los siguientes métodos:
public void pgWeb(View view) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.androidcurso.com/")); startActivity(intent); } public void llamadaTelefono(View view) { Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:962849347")); startActivity(intent); } public void googleMaps(View view) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:41.656313,-0.877351")); startActivity(intent); } public void tomarFoto(View view) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivity(intent); } public void mandarCorreo(View view) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_SUBJECT, "asunto"); intent.putExtra(Intent.EXTRA_TEXT, "texto del correo"); intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jtomas@upv.es"}); startActivity(intent); }
fun pgWeb(view: View) = startActivity( Intent(Intent.ACTION_VIEW, Uri.parse("http://www.androidcurso.com/"))) fun llamadaTelefono(view: View) = startActivity( Intent(Intent.ACTION_DIAL, Uri.parse("tel:962849347"))) fun googleMaps(view: View) = startActivity( Intent(Intent.ACTION_VIEW, Uri.parse("geo:41.656313,-0.877351"))) fun tomarFoto(view: View) = startActivity( Intent(MediaStore.ACTION_IMAGE_CAPTURE)) fun mandarCorreo(view: View) = startActivity( Intent(Intent.ACTION_SEND).apply { type = "text/plain" putExtra(Intent.EXTRA_SUBJECT, "asunto") putExtra(Intent.EXTRA_TEXT, "texto del correo") putExtra(Intent.EXTRA_EMAIL, arrayOf("jtomas@upv.es"))})
4. Asocia el atributo onClick de cada uno de los botones al método correspondiente.
Si ejecutas esta aplicación en un emulador, es muy posible que los botones de mandar correo o GoogleMaps no funcionen. La razón es que no hay ninguna aplicación instalada en el emulador que sea capaz de realizar este tipo de acciones. Si tienes estos problemas, abre el AVD Manager y crea un dispositivo virtual con Google API. Estos dispositivos incorporan, además de las API de Android, algunas de las API de Google, como la de Google Maps (estas API se estudiarán más adelante).
. 6. Ejecuta la aplicación en un terminal real. Observa como el botón mandar Correo te permite seleccionar entre diferentes aplicaciones con esta funcionalidad.
7. Este resultado puede variar en función de las aplicaciones instaladas.
Recursos adicionales: Tabla con intenciones que podemos utilizar de aplicaciones Google
Aplicación |
URI |
Acción |
Resultado |
Browser |
http://dirección_web |
VIEW |
Abre una ventana de navegador con una URL. |
"" (cadena vacía) http://dirección_web |
WEB_SEARCH |
Realiza una búsqueda web. Se indica la cadena de búsqueda en el extra |
|
Dialer |
tel:número_teléfono |
CALL |
Realiza una llamada de teléfono. Los números válidos se definen en IETF RFC 3966 . Entre estos se incluyen: tel:2125551212 y tel:(212)5551212. Necesitamos el permiso |
tel:número_teléfono |
DIAL |
Introduce un número sin llegar a realizar la llamada. |
|
Google Maps |
geo:latitud,longitud |
VIEW |
Abre la aplicación Google Maps para una localización determinada. El campo z específica el nivel de zum. |
Google Streetview |
google.streetview: cbll=latitud,longitud& cbp=1,yaw,pitch,zoom& mz=mapZoom |
VIEW |
Abre la aplicación Street View para la ubicación dada. El esquema de URI se basa en la sintaxis que utiliza Google Maps. Solo el campo cbll es obligatorio. |
Práctica: Uso de intenciones implícitas
1. Crea nuevos botones en la aplicación del ejercicio anterior y experimenta con otro tipo de acciones y URl. Puedes consultar la tabla anterior. A continuación tienes algunas propuestas:
2. Compara las acciones VIEW y WEB_SEARCH. ¿Encuentras alguna diferencia?
3. Compara las acciones CALL y DIAL. ¿Encuentras alguna diferencia?
4. Experimenta con Google Streetview
Preguntas de repaso: Intenciones