Diferencia entre revisiones de «Usuario:ManuelRomero/Android/Intents»
De WikiEducator
(Página creada con '{{:Usuario:ManuelRomero/Android/nav}} <br> ===Intents=== ;Referencia http://developer.android.com/reference/android/content/Intent.html *Definición de la página oficial {{De…') |
(→Devolver valores a una activity que me invocó) |
||
(14 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 1: | Línea 1: | ||
+ | {{TEP}} | ||
+ | {{Reflexion| #'''''Se han detectado puntos incompletos en el contendio de este tema''''' | ||
+ | ''En breve se actualizará, '''de momento no se recomienda su estudo''' ''.}} | ||
{{:Usuario:ManuelRomero/Android/nav}} | {{:Usuario:ManuelRomero/Android/nav}} | ||
<br> | <br> | ||
===Intents=== | ===Intents=== | ||
+ | [[Archivo:claseIntent.png]] | ||
;Referencia | ;Referencia | ||
http://developer.android.com/reference/android/content/Intent.html | http://developer.android.com/reference/android/content/Intent.html | ||
*Definición de la página oficial | *Definición de la página oficial | ||
{{Definicion|'''''Un intent es una descripción abstracta de una operación que va a llevar a cabo}} | {{Definicion|'''''Un intent es una descripción abstracta de una operación que va a llevar a cabo}} | ||
+ | *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== | ==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) | |
− | + | <source lang = java> | |
− | + | /*Actividad 2 es una actividad del paquete*/ | |
− | + | ... | |
− | + | Intent i = new Intent(this, Actividad2.class); | |
− | + | startActivity(i); | |
− | + | ... | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</source> | </source> | ||
− | * | + | *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 |
+ | <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> | ||
+ | ;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. | ||
<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> | ||
− | + | ||
− | + | ===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 | |
− | *Ahora | + | La activity A llama a la Activity B |
− | + | Para ello usamos el método | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | *La | + | |
− | * | + | |
− | + | ||
<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 |
− | <source lang=java> | + | *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. | |
− | + | ||
− | + | <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(); } }