Bienvenidos sean a este post, en el caso de hoy dejaremos un poco a la app Asteroides de costado para centrarnos en un tema, en este caso intenciones.
Las intenciones son la voluntad de poder realizar alguna accion o tarea, estas pueden ser actividades, servicios o una aplicacion diferente. Hay dos tipos de intenciones:
- Intenciones explicitas, son las que se indican que componente se debe lanzar, es decir las actividades utilizadas hasta ahora en nuestras apps (Asteroides y MisLugares)
- Intenciones implicitas, son aquellas mas de tipo abstractas donde nosotros podemos tener una idea no concreta como “querer tomar una foto” o “querer acceder a una web”, en este caso el Sistema evaluara las posibilidades y le consultara al usuario sobre cual ejecutar de todas las posibles.
No se preocupen por el segundo caso mas adelante veremos algunos casos mas concretos, las intenciones permiten el paso de informacion e intercomunicacion entre distintos componentes. Las intenciones se ejecutan cuando ocurre cualquiera de los siguientes casos:
- Lanzar una actividad (startActivity y startActivityForResult)
- Lanzar un servicio (startService)
- Lanzar un tipo de anuncio broadcast (sendBroadcast)
- Conectarnos con un servicio (bindService)
Cuando la intencion es creada, esta tiene informacion importante para que el sistema trate adecuadamente la intencion o para el componente que reciba la intencion. Esta consta de las siguientes partes:
- Nombre del componente, identifica al componente que queremos lanzar, esto es lo que llamamos intencion explicita
- Accion, una cadena de caracteres donde indicamos la accion a realizar
En este ultimo caso, intent define una serie de constantes para acciones genericas, veamos la siguiente tabla para ver algunos:
Constante | Componente a lanzar | Accion |
ACTION_CALL | Actividad | Inicia una llamada de telefono |
ACTION_EDIT | Actividad | Visualiza datos para su edicion |
ACTION_MENU | Actividad | Inicia como actividad principal de una tarea (Sin enviar o recibir datos |
ACTION_SYNC | Actividad | Sincroniza datos en un servidor con los del dispositivo movil |
ACTION_BATTERY_LOW | Receptor de anuncios | Advertencia de bateria baja |
ACTION_HEADSET_PLUG | Receptor de anuncios | Indicador de conexion o desconexion de auriculares |
ACTION_SCREEN_ON | Receptor de anuncios | Se ha activado la pantalla |
ACTION_TIMEZONE_CHANGED | Receptor de anuncios | Indica el cambio de la zona horaria |
Las acciones tambien pueden ser definidas por nosotros pero en lugar de usarlo directamente como se ve en la tabla debera tener todo el paquete, por ejemplo: com.tinchicus.asteroides.MOSTRAR_PUNTUACIONES
- Categoria, complementa a la accion e indica informacion adicional sobre el tipo de componente a ser lanzado ahora veamos algunas categorias que pueden ser utilizadas por intent
Constante | Significado |
CATEGORY_BROWSABLE | La actividad lanzada puede ser utilizada con seguridad por el navegador |
CATEGORY_HOME | Muestra la pantalla de inicio, la primera pantalla que ve el usuario |
CATEGORY_LAUNCHER | Puede ser la actividad inicial de una tarea y se muestra en el lanzador de aplicaciones en el nivel superior |
CATEGORY_PREFERRENCE | La actividad a lanzar es un panel de preferencias |
Como dijimos antes estas son complementos de las acciones, por ejemplo indicaremos ACTION_MAIN a las actividades que son puntos de entrada y a su vez complementarla con CATEGORY_LAUNCHER para que la misma se vea en la pantalla de inicio
- Datos, referencia a los datos con que trabajaremos y estos deben ser enviados por medio de URI, Indicador de Recursos Uniforme, por sus siglas en ingles. Ejemplos de URI son: tel:01155556666, https://tinchicus.com/, para estos casos siempre es util indicar el MIME (Multipurpose Internet Mail Extensions) para manipular correctamente el tipo de dato, ejemplos de identificadores son: text/xml, image/jpeg, etc.
- Extras, informacion adicional que sera recibida por el componente. Este tipo de informacion lo hemos visto cuando estudiamos actividades y por medio del metodo putExtra() enviabamos la informacion hacia la actividad por ejemplo podriamos usar: intent.putExtra(“nombre”,”Martin”); donde el primer campo sera el identificador y el segundo el dato. Les recomiendo este post para ver mas sobre esto
Ahora veamos un pequeño ejemplo para entender sobre las intenciones, abramos nuestro Android Studio y seleccionemos Start a new Android Studio project

Una vez seleccionado nos aparecera el siguiente cuadro

Aca deben modificar Application name por Intenciones, y en Company domain pueden agregar example.org o si disponen de uno propio como es mi caso tambien pueden utilizarlo, el resto debe quedar como aparece y pulsar Next para que aparezca el siguiente cuadro

Aca deben dejarlo con la version mas baja disponible de API, en lo personal les recomiendo esta API y seleccionen Phone and Tablet solamente tal como se ve en la imagen, luego pulsen Next y pasaremos al siguiente cuadro

En este cuadro deben seleccionar Empty Activity, esto nos creara una actividad basica pero vacia, pulsen Next y pasaremos al siguiente cuadro

Aca deberia aparecer como se ve en la imagen, en caso contrario deben dejarlo como se ve en la imagen, pulsan Finish y comenzara la creacion de nuestra app.
Una vez finalizada ingresaremos al editor de Android Studio para modificar el layout generado automaticamente, para eso debemos abrir el archivo activity_main.xml y seleccionar la solapa Text donde tendremos el siguiente codigo fuente:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
Lo reemplazaremos por el siguiente codigo:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/pgWeb"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="abrir pagina web"
android:onClick="paginaWeb" />
<Button
android:id="@+id/llamada"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="llamada telefonica"
android:onClick="llamadaTelefono" />
<Button
android:id="@+id/mapas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="google maps"
android:onClick="googleMaps" />
<Button
android:id="@+id/foto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="tomar foto"
android:onClick="tomarFoto" />
<Button
android:id="@+id/correo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="mandar correo"
android:onClick="mandarCorreo" />
</LinearLayout>
Como pueden ver cambiamos el tipo de layout, ahora es LinearLayout, y agregamos cinco botones para crear las actividades con las intenciones, ahora no se preocupen por el evento onClick porque si bien ahora puede generar un error lo solucionaremos en nuestra siguiente modificacion. Ahora vamos a nuestra clase MainActivity para agregar los metodos faltantes, veamoslo a continuacion:
public void paginaWeb(View view){
Intent i = new Intent(Intent.ACTION_VIEW,
Uri.parse("https://tinchicus.com"));
startActivity(i);
}
public void llamadaTelefono(View view){
Intent i = new Intent(Intent.ACTION_CALL,
Uri.parse("tel:1146972305"));
startActivity(i);
}
public void googleMaps(View view){
Intent i = new Intent(Intent.ACTION_VIEW,
Uri.parse("geo:-32.0688462,-64.5754776"));
startActivity(i);
}
public void tomarFoto(View view){
Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
startActivity(i);
}
public void mandarCorreo(View view){
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(i.EXTRA_SUBJECT, "asunto");
i.putExtra(i.EXTRA_TEXT,"texto del correo");
i.putExtra(i.EXTRA_EMAIL, new String[] {"mrbogusa@gmail.com"});
startActivity(i);
}
Como pueden ver creamos las actividades para cada boton, observen como dependiendo la actividad utilizamos el intento correspondiente, los mas interesantes para mi son de las funciones tomarFoto() donde utilizaremos una constante desde el paquete para el accionar de la camara, el otro es mandarCorreo() porque por medio de setType() definimos el tipo de MIME y despues con los metodos putExtra() enviamos la informacion para armar el mail, ahora solo nos resta una modificacion mas para poder probar nuestra app, pero antes veamos como quedo finalmente la clase MainActivity:
package org.example.intenciones;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void paginaWeb(View view){
Intent i = new Intent(Intent.ACTION_VIEW,
Uri.parse("https://tinchicus.com"));
startActivity(i);
}
public void llamadaTelefono(View view){
Intent i = new Intent(Intent.ACTION_CALL,
Uri.parse("tel:1155556666"));
startActivity(i);
}
public void googleMaps(View view){
Intent i = new Intent(Intent.ACTION_VIEW,
Uri.parse("geo:-32.0688462,-64.5754776"));
startActivity(i);
}
public void tomarFoto(View view){
Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
startActivity(i);
}
public void mandarCorreo(View view){
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(i.EXTRA_SUBJECT, "asunto");
i.putExtra(i.EXTRA_TEXT,"texto del correo");
i.putExtra(i.EXTRA_EMAIL, new String[] {"mrbogusa@gmail.com"});
startActivity(i);
}
}
Ahora procedamos a abrir el archivo AndroidMainfest.xml para agregar la siguiente linea:
<uses-permission android:name="android.permission.CALL_PHONE" />
Nuestro archivo quedara de la siguiente forma:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.example.intenciones">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.CALL_PHONE" />
</manifest>
Esta linea nos permitira hacer llamadas por medio de nuestra app, ahora si pasemos a probar nuestra app, veamoslo por medio del siguiente video
Como pueden ver en el video a medida que vamos llamando a cada una de nuestras actividades se ejecutan las aplicaciones relacionadas a cada una de nuestras intenciones, es decir la pagina web, hacer una llamada, abrir google maps, etc. y como dijimos antes y vimos en el post de Actividades, la intencion puede ser explicita llamando directamente a la actividad, en ese caso una vista, o implicita como en este ejemplo donde nosotros le damos una constante y la app se encarga de llamar a la aplicacion o al servicio relacionado para poder ejecutar dicha actividad.
En resumen, hoy hemos visto que son las intenciones, para que sirven, cuales son sus funciones y un ejemplo para poner en practica los intenciones implicitas. Espero les haya gustado, sigueme en Twitter, Facebook o Google+ para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.00