Cuando uno empieza a programar para Android se suele topar mas pronto que tarde con el concepto de Intent y de repende comienzan a surgir muchas dudas. Si miramos en el diccionario la traducción es “Intento” la cual no nos aporta una solución.
¿Que es un Android Intent?
Un Intent tiene mucho mas que ver con el concepto de Tarea y como dos programas se comunican la información sobre dicha tarea entre ellos . Vamos a ver un ejemplo sencillo .Supongamos que tenemos dos programas (A y B) y el programa A quiere que el programa B ejecute una tarea de envío de correo. Podríamos crear las siguientes clases .
En un primer lugar estariamos muy contentos porque tenemos el concepto de Tarea para enviar correo que es compartida por las dos clases .Ahora bien que pasará cuando tengamos mas programas que pueden hacer mas tareas.
Pues lo que pasará es que cada vez tendremos mas clases de tipo Tarea .Una clase por cada tarea a realizar esto presentará un problema de mantenimiento del código ya que deberemos conocer todas las tareas y crear todas las clases . ¿Que solución se puede diseñar que nos ayude a paliar este problema ?. Bueno una opción sencilla es diseñar una clase Tarea que soporte cualquier tipo de parámetros utilizando un HashMap (Diccionario) de esta manera cualquier programa podrá enviar los datos que desee asignando una clave y un valor y el programa de destino podrá leerlos vamos a verlo en código :
package com.arquitecturajava; import java.util.HashMap; public class Tarea { private HashMap<String,String> parametros = new HashMap<String,String>(); public void setParametro (String clave,String valor) { parametros.put(clave, valor); } public String getParametro(String clave) { return parametros.get(clave); } }
Una vez que tenemos la Tarea vamos a invocarla desde un programa de consola
</pre> package com.arquitecturajava; public class Principal { /** * @param args */ public static void main(String[] args) { Tarea t = ProgramaA(); ProgramaB(t); } public static Tarea ProgramaA() { Tarea t = new Tarea(); t.setParametro("asunto", "hola"); t.setParametro("tipo", "correo"); t.setParametro("texto", "hola es un correo de prueba"); return t; } public static void ProgramaB(Tarea t) { System.out.println(t.getParametro("asunto")); System.out.println(t.getParametro("texto")); } } <pre>
Realizada esta modificación solo necesitaremos un concepto de Tarea para compartir datos entre todos los programas cada uno pasará los parametros que considere oportunos . El programa de destino se encargará de leerlos.
Android usa el mismo enfoque que acabamos de ver para gestionar el paso de Tareas . Solo que en este caso lo denomina Intent. Vamos a ver un ejemplo sencillo en el cual una Actividad invoca la tarea de abrir una segunda Actividad pasando un parámetro nombre.
package com.example.androidintent; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button boton1= (Button) findViewById(R.id.boton1); boton1.setOnClickListener(this); } @Override public void onClick(View arg0) { Intent tarea= new Intent(this,SegundaActivity.class); tarea.putExtra("nombre", "cecilio"); startActivity(tarea); } }
Esta segunda Actividad lee los datos y nos los muestra:
package com.example.androidintent; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class SegundaActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_segunda); Intent tarea =getIntent(); String nombre=tarea.getStringExtra("nombre"); Toast.makeText(this, nombre, Toast.LENGTH_SHORT).show(); } }
De esta manera tan sencilla funcionan los Intents . Aparte de estos pasos es obligatorio registrar la segunda Actividad en el fichero de manifiesto.
</pre> <activity android:name="com.example.androidintent.SegundaActivity" android:label="@string/title_activity_segunda" > </activity> <pre>
En otro Post hablaremos de ello . Espero que los diagramas hayan ayudado un poco a entender mejor este concepto de la plataforma Android.
Hola. Muy buena la explicación, y aclaratoria. Solo un apunte: “intent” no significa “intento” en español; su significado es “intención” o “propósito”, “finalidad”, lo cual ya sí tiene más sentido con la explicación que das.
Un saludo.
[…] artículos relacionados: Android Intents , Android […]
Hola que tal gracias por esta información, tengo una duda como puedo hacer esto pero con una clase de extiende de GcmListenerService, esta clase recibe mensajes que le mando al dispostivo desde mi pagina web y lo muestra al usuario como una notificación en su dispositivo, estos mensajes yo los quiero recuperar para usarlos con otra activivity, ya intente hacerlo como muestras en el ejemplo, también lo hice usando un BroacastReceiver y recuperar los mensajes pero aun asi sigo sin conseguirlo espero me puedas orientar gracias.
no te se decir ya lo siento
Al fin me ha quedado claro el tema de Intents 🙂
Aunque el problema viene cuando tengo los programas A, B, C y D instanciados y quiero regresar a ellos mediante los Intents … o mediantes un boton.
Por otro lado, agradecerte tu blog, hace un tiempo consulté tambien los posts sobre conceptos avanzados de JAVA y la verdad es que esta todo muy bien explicado.
Por ultimo, queria pedirte cuàl es el programa que usas para realizar estos diagramas tan limios y claros. Como docente me irian muy bien para mis clases 🙂
Un saludo.
es el omnigrafle para mac 🙂 , no se si te entiendo bien pero los intents tienen opciones de volver al anterior
Me refiero a tener 3 actividades: A,B,C e ir añadiendo contenido a la A mientras voy lanzando B y C. Evidentemente, solamente con A instanciado una vez (usando singleTask o singleInstance).
Gracias por el comentario de los diagramas 🙂
Que buena esta página muy ilustradora. Gracias por la labor.
me alegro que te haya sido util 🙂
[…] artículos relacionados : android eventos , android intents , android y […]
[…] artículos relacionados :Android Intents , Android Eventos , Android […]
Hola Cecilio Felicidades!! Todos los archivos que subes son muy buenos, gracias por compartirlos.
Podrías escribir más sobre android por favor !! De antemano gracias !! =D
No te preocupes jhosef es uno de los temas de los cuales voy a seguir escribiendo 🙂
Hola Cecilio, podrás hacer una entrada que hable de fragment?
Saludos
pd: estuve un tiempito si entrar y vuelvo y me encuentro con una cantidad de material!!
Tengo ahora todavia unas cosas pendientes de hablar pero prometo volver a hablar de android las próximas semanas me apunto la idea 🙂