Usuario:ManuelRomero/Android/Intents
De WikiEducator
< Usuario:ManuelRomero | Android
Revisión a fecha de 04:25 13 ene 2014; ManuelRomero (Discusión | contribuciones)
Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos. Ver página de charlas. |
#Se han detectado puntos incompletos en el contendio de este tema
En breve se actualizará, de momento no se recomienda su estudo . |
Intents
- Referencia
http://developer.android.com/reference/android/content/Intent.html
- Definición de la página oficial
- Los objetos de tipo android.content.Intent se utilizan para enviar mensajes asíncronos dentro de una aplicación o entre varias aplicaciones.
- Estos mensajes permiten desde una aplicación lanzar o invocar la ejecución de un componente de aplicación
- Activity.
- Service.
- ContentProvider.
- Boradcast.
- Así, los Intents permiten enviar o recibir información desde y hacia otros componetes de aplicación.
- Esta información puede consistir simplemente en iniciar la ejecución de una aplicación en android, por ejemplo una actividad.
Intents para lanzar activity
- Un Intent es un objeto que tiene una estructura de datos que contiene la información necesaria para lazar la ejecución de un componente.
- Este componentes puede ser como ya hemos comentado una activity desarrollada en nuestra aplicación o bien también podemos ejecutar una aplicación disponible en android http://developer.android.com/guide/appendix/g-app-intents.html
- Al Intent se le puede asociar la Activity que queremos que se lance, o bien a la Activity asociarle un nombre de accion para que el Intent tenga asociada dicha accion y al invocarlo se puda ejecutar la Activity que tenga asociada dicha acción
- La forma de asociar a una Activity, una acción usado el elemento <intent-filter> en el fichero Manifest de nuestra activity
Usando un Intent
- Un intent necesita información para saber qué aplicación tiene que lanzar
- Esta información la podemos pasar de diferente manera.
- Desde el punto de vista de la información, un Intent es una estructura de datos con la siguiente composición :
- component, es el componente de la aplicación que queremos que se ejecute.
- action, indica la acción asociada al Intent. con ella trataremos de encontrar los componetes que llevan a caba esa acción.
- data, son los datos necesarios para una determinada accion.
- category, forma de agrupar actividades que detallan conciones que pueden hacer
- extra, permite dar valores a un objeto Bundle en formato etiqueta-valor; Con ello podremos pasar valores al componentes que invoquemos.
- type, especifica de forma explícita el tipo de datos del intent.
- Vamos a ver a continuación como se puede usar un Intent
Intent Explícito o Implícito
- Intent explícito
- Un intent es explícito cuando de forma explícita detallamos el componente que queremos lanzar.
- Para ello detallaremos el componente.
- Esto se puede hacer en el contructor o usando métodos explícitos de la clase
- En el constructor
Intent(Context packageContext, Class<?> cls)
/*Actividad 2 es una actividad del paquete*/ ... Intent i = new Intent(this, Actividad2.class); startActivity(i); ...
- Usando métodos de la clase Intent para establecer el componente que queremos invocar
getComponent(...), getClass(...) getClassName(...).
- Y para recuperar el nombre del componente
getComponent()
- Ejemplo
... Intent i = new Intent(); i.setClass(this,Actividad2.class); startActivity(i); ... /*Otra manera de hacer lo mismo*/ Intent i=new Intent(); i.setComponent(new ComponentName(this,Actividad2.class)); startActivity(i); /*Lo mismo usando el nombre del java*/ ... Intent i = new Intent(); i.setClassName(this, "com.example.interaccionactivitys.Actividad2"); startActivity(i); ...
- Intent Implícito
- En este caso creamos el intent pasando un nombre de accion.
- El sistema buscará qué actividad puede realizar esa acción y la ejecutará.
- En caso de haber más de una actividad que pueda realizar esa acción nos mostrará la lista para que la realicemos.
- La forma de asociar a una Activity una acción es usando el elemento <action-filter> del fichero manifest
- La accion la podemos pasar en el constructor del Intent.
- Android tiene aplicaciones por defe
Intents con parámetros
- Es muy posible que queramos pasar/recuperar datos entre actividades
- Por ejemplo que una activity me pase usuario y contraseña para validar
Pasar valores a través de un Intent
- Una vez creado el Intent, creamos un objeto Bundle
- A este objeto le asignamos valores en la forma de parejas etiqueta-valor usando métodos del tipo putxxx
- asociamos el objeto Bundle al Intent con el método putExtras( Bundle ) y ya tenemos los valores preaparados para que sean pasados a la activity o componente que active el Intent.
//Primero defino el intent y le asocia una actividad que quiero que invoque. Intent intencion = new Intent(); intencion.getClass(this,miclase.class); //Defino el bundle para asignar parejas variable-valor Bundle datos = new Bundle(); datos.putInt("edad",25); datos.putString("nombre","pedro"); //Asocio el bundle al intent intencion.putExtras(datos); //Activo la activity startActivity(intencion);
Leer los datos que pasa el intent
- Para leer los datos en la activity invocada con el intent, se hace de manera sencilla
- Creamos un objeto budle
- Lo instanciamos con el bundle que nos retorna el método getExtras del intent que lo ha activado (con el método getIntent()
- Lemos los valores con los métodos getXXX(etiqueta)
public class ClaseInvocadaConIntent extends Activity { .... @Override protected void onCreate(Bundle estado){ Bundle valores = getIntent().getExtras(); int edad = valores.getInt("edad"); String nombre = valores.getString("nombre"); ...... } ....
Devolver valores a una activity que me invocó
- Ahora vamos a ver como es el proceso en el que la activity invocada retorna valores a la activity que la invocó
Archivo:ActivityRetornaValores.png
- Situación
- La activity A invoca a la activity B
- La activity B retorna un valor a la activity A
- Paso 1
La activity A llama a la Activity B
Para ello usamos el método
startActivityForResult(Intnet i, int codigo);
- En este caso pasamos un segundo parámetro que es un código que indentifica la invocación de la acción
- Este código permitirá asegurarnos que retorno de esta activity y no de otra.
- Supongamos que una activity pueda invocar a varias.
- en el retorno de cualquiera de ellas si retorna valor, siempre iré al método onActivityResult(int resquest, int result , Intendt)
- Analizando el parámetro request podemos ver de qué intent venimos (que será el mismo valor que le hayamos pasado en la invocación.
........ public void clickActividad_B(View v){ Intent i = new Intent(this,ActividadB.class); String nombre=((EditText)findViewById(R.id.TNombre)).getText().toString(); String apellido=((EditText)findViewById(R.id.editText1)).getText().toString(); Bundle datos = new Bundle(); datos.putString("nombre",nombre); datos.putString("apellido",apellido ); i.putExtras(datos); startActivityForResult(i,OK_ACTIVIDAD_2); } public void clickActividad_C(View v){ Intent i = new Intent(this,ActividadB.class); String nombre=((EditText)findViewById(R.id.TNombre)).getText().toString(); String apellido=((EditText)findViewById(R.id.editText1)).getText().toString(); Bundle datos = new Bundle(); datos.putString("nombre",nombre); datos.putString("apellido",apellido ); i.putExtras(datos); startActivityForResult(i,OK_ACTIVIDAD_3); } @Override public void onActivityResult(int codAccion, int codDatos, Intent i){ ......... if (codAccion==OK_ACTIVIDAD_2) Log.i("ActividadA","Vengo de actividad OK_2, Actividad B"); if (codAccion==OK_ACTIVIDAD_3) Log.i("ActividadA","Vengo de actividad OK_3, Actividad C"); ...... } }
Devolviendo resultados
- Ahora queremos hacer un diseño como el siguiente
- Realizamos los diseños
fichero manifest con dos activity Dos ficheros java dos ficheros de layout
Los ficheros java
public void validarUsuario(View v){ Intent datosUsuario = new Intent(); EditText tNombre= (EditText) findViewById(R.id.Nombre); EditText tApellido= (EditText) findViewById(R.id.Apellido); //Obtenemos el valor de la caja de texto //Utilizamos putExtra() para obtener los pares nombre/valor datosUsuario.putExtra("nombre", tNombre.getText().toString()); datosUsuario.putExtra("apellido", tApellido.getText().toString()); //Utilizamos el método setData() para devover algunos valores datosUsuario.setData(Uri.parse("Enviando valores")); //Establecemos el resultado con OK setResult(RESULT_OK,datosUsuario); //Destruimos el objeto finish(); //iniciamos actividad datosUsuario.setClass(this, ValidacionDatos.class); startActivityForResult(datosUsuario,1); } public void onActivityResult (int codigoRespuesta, int codigoResultado, Intent datos){ if (codigoRespuesta==1){ if (codigoResultado == RESULT_OK){ Toast.makeText(this, "no no se se", Toast.LENGTH_LONG); } } }
public class ValidacionDatos extends Activity { public void onCreate(Bundle estadoActividad){ super.onCreate(estadoActividad); setContentView(R.layout.activity_validacion_datos); //Obtener los datos pasados usand getStringExtra() Toast.makeText(this,getIntent().getStringExtra("nombre"),Toast.LENGTH_LONG).show(); //Obtener los datos pasados usand getStringExtra() Toast.makeText(this,getIntent().getStringExtra("apellido"),Toast.LENGTH_LONG).show(); //Obetener el objeto Bundle pasado //Bundle nose=getIntent().getExtras(); //Obtener los datos pasados usand getStringExtra() //Toast.makeText(this,nose.getString("nombre"),Toast.LENGTH_LONG).show(); //Obtener los datos pasados usand getStringExtra() //Toast.makeText(this,nose.getString("apellido"),Toast.LENGTH_LONG).show(); } public void clickValidacion(View v) { Toast.makeText(this,"Valicación terminada",Toast.LENGTH_LONG).show(); finish(); } }