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[TutorialLas 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
 a lanzar

Acción

ACTION_CALL

Actividad

Inicializa una llamada de teléfono.

ACTION_EDIT

Actividad

Visualiza datos para que el usuario los edite.

ACTION_MAIN

Actividad

Arranca como actividad principal de una tarea. (sin datos de entrada y sin devolver datos)

ACTION_SYNC

Actividad

Sincroniza datos en un servidor con los datos de un dispositivo móvil.

ACTION_BATTERY_LOW

Receptor de anuncios

Advertencia de bateria baja.

ACTION_HEADSET_PLUG

Receptor de anuncios

Se han conectado o desconectado los auriculares.

ACTION_SCREEN_ON

Receptor de anuncios

Se ha activado la pantalla.

ACTION_TIMEZONE_CHANGED

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

CATEGORY_BROWSABLE

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

CATEGORY_HOME

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.

CATEGORY_LAUNCHER

La actividad puede ser la actividad inicial de una tarea y se muestra en el lanzador de aplicaciones de nivel superior.

CATEGORY_PREFERENCE

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
https://dirección_web

VIEW

Abre una ventana de navegador con una URL.

"" (cadena vacía)

http://dirección_web
https://dirección_web

WEB_SEARCH

Realiza una búsqueda web. Se indica la cadena de búsqueda en el extra SearchManager.QUERY 

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 android.permission.CALL_PHONE

tel:número_teléfono
voicemail:

DIAL

Introduce un número sin llegar a realizar la llamada.

Google Maps

geo:latitud,longitud
geo:lat,long?z=zoom
geo:0,0?q=dirección
geo:0,0?q=búsqueda

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