Diferencia entre revisiones de «Usuario:ManuelRomero/Android/Intents»
De WikiEducator
(→Devolver valores a una activity que me invocó) |
|||
(8 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 28: | Línea 28: | ||
==Usando un Intent== | ==Usando un Intent== | ||
*Un intent necesita información para saber qué aplicación tiene que lanzar | *Un intent necesita información para saber qué aplicación tiene que lanzar | ||
− | *Esta información la podemos pasar de diferente manera | + | *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''''' | + | #'''''action''''', indica la acción asociada al Intent. con ella trataremos de encontrar los componetes que llevan a caba esa acción. |
− | #'''''data''''' | + | #'''''data''''', son los datos necesarios para una determinada accion. |
− | #'''''category''''' forma de agrupar actividades que detallan conciones que pueden hacer | + | #'''''category''''', forma de agrupar actividades que detallan conciones que pueden hacer |
− | #'''''extra''''' | + | #'''''extra''''', permite dar valores a un objeto Bundle en formato etiqueta-valor; Con ello podremos pasar valores al componentes que invoquemos. |
− | #'''''type''''' | + | #'''''type''''', especifica de forma explícita el tipo de datos del intent. |
*Vamos a ver a continuación como se puede usar un Intent | *Vamos a ver a continuación como se puede usar un Intent | ||
− | ===Intent Explícito o | + | ===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. | *Un intent es explícito cuando de forma explícita detallamos el componente que queremos lanzar. | ||
*Para ello detallaremos el componente. | *Para ello detallaremos el componente. | ||
Línea 55: | Línea 56: | ||
getComponent() | getComponent() | ||
*Ejemplo | *Ejemplo | ||
− | <> | + | <source lang=java> |
+ | ... | ||
+ | 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); | |
− | + | ... | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | * | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</source> | </source> | ||
− | + | ;Intent Implícito | |
− | *En este caso el | + | *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. | ||
<source lang=java> | <source lang=java> | ||
− | + | //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); | ||
</source> | </source> | ||
− | + | ||
+ | ===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)''''' | ||
+ | |||
<source lang=java> | <source lang=java> | ||
− | + | 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"); | |
− | + | ...... | |
− | + | } | |
− | + | .... | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</source> | </source> | ||
− | === | + | |
− | *Ahora | + | ===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 | ||
<source lang=java> | <source lang=java> | ||
− | + | startActivityForResult(Intnet i, int codigo); | |
− | + | ||
− | + | ||
</source> | </source> | ||
− | * | + | *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. | |
− | <source lang=java> | + | **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. | |
− | + | ||
− | + | <source lang = java> | |
− | + | ........ | |
− | + | 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"); | ||
+ | |||
+ | ...... | ||
+ | |||
+ | } | ||
+ | } | ||
</source> | </source> | ||
− | |||
− | |||
− | |||
===Devolviendo resultados=== | ===Devolviendo resultados=== | ||
*Ahora queremos hacer un diseño como el siguiente | *Ahora queremos hacer un diseño como el siguiente |
Última revisión de 04:25 13 ene 2014
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(); } }