Usuario:ManuelRomero/Android/Intents
De WikiEducator
< Usuario:ManuelRomero | Android
Revisión a fecha de 00:28 23 nov 2013; 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, ahora lo veremos
- Para es información, un Intent es una estructura de datos con la siguiente composición
- Component Es el componente de 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 para poder pasar varles al componentes que invocquemos
- type Especificad e forma explicita el tipo de datos de intent.
- Vamos a ver a continuación como se puede usar un Intent
Intent Explícito o implicito
- 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 accion es usando el elemento <action-filter> del fichero manifest
- La accion la podemos pasar en el constructor del Intent.
- Android tiene aplicaciones por defecto que tienen acciones asociadas http://developer.android.com/guide/appendix/g-app-intents.htm, en cuyo caso podemos usar directamente la aplicacion
- Recordar que normalmente hay que dar permisos para poder usar estas aplicaciones ya que muhcas de ellas implcan acceder al hardware del dispositivo.
- Es posible que la action requiera valores, en ese caso los debemos pasar en un objeto de tipo Uri
Intent(String action) Intent(String action, Uri uri)
- Veamos un ejemplo
Intent i = new Intent("maria"); startActivity(i);
- Idea: hacer un programa como se ve en la figura
- Cada pantalla será un activity.
- El click del activity 1 abrirá el activity 2
- El click del activity 2 cerrará el activity 2 y volverá al activity 1
Empezamos
- Creamos un proyecto nuevo llamado p.e. usandoIntents
- Clase ActividadPrimera.java
- Layout 'actividad_primera.xml
- Por supuesto los nombres son opciones
- Creamos una clase nueva llamada ActividadSegunada.java
- Al tener dos activity debemos indicarlo en el fichero Manifiest.xml
- Añadimos la nueva clase activity
- Vemos a continuación la parte del manifest con las clases
<activity android:name=".ActividadPrimera" android:label="@string/title_activity_actividad_primera" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ActividadSegunda" android:label="@string/title_activity_actividad_segunda" > <intent-filter> <action android:name="com.example.objetosintents.ActividadSegunda" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
- Nos debemos fijar en el elemento intent-filter
- En este caso el elementos action tiene el nombre del filtro especificado al nombre de la clase', a diferencia del activity principal' que contenía el valor MAIN
- De este modo otras actividades que quieran llamar a ésta lo harán por este nombre
- El elemento category para el filtro contiene el valor DEFAULT el lugar del valor LAUNCHER
- Esto indica que esta actividad será lanzada por defecto siendo invocada por otra mediante el método 'startActivity()' no desde el lanzador de aplicaciones del dispositivos
Los layouts
- Creamos los dos layouts para cada activity
- Cada uno contendrá una etiqueta de texto o label y un botón (por las especificaciones primeras
- Los layouts les hemos llamado en este caso actividad_primera.xml y actividad_segunda.xml
- actividad_primera.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/actividad1" tools:context=".ActividadPrimera" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/textView1" android:layout_marginLeft="40dp" android:layout_marginTop="41dp" android:onClick="activity1" android:text="Activar activity 2" /> </RelativeLayout>
- actividad_segunda.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/actividad2" tools:context=".ActividadSegunda" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" android:layout_marginTop="58dp" android:onClick="activity2" android:text="Cerrar actividad 2 y volver a 1" /> </RelativeLayout>
- En el fichero string.xml tenemos las etiquetas usadas
<string name="title_activity_actividad_primera">ActividadPrimera</string> <string name="title_activity_actividad_segunda">ActividadSegunda</string> <string name="actividad1">Esta es la actividad primera y principal</string> <string name="actividad2">Esta es la actividad segunda</string>
El fichero java
- Ahora sólo queda lo que hacemos en el método del click
- En la actividad primera tenemos el método activity1 (ver el fichero del layout de esta actividad)
public void activity1(View v){ startActivity (new Intent("com.example.objetosintents.ActividadSegunda")); }
- La forma de iniciar una actividad es con el método startActivity()'
- como parámetro le pasamos una instancia de un objeto Intents con el nombre de la clase de la actividad como parámetro
- Se puede plantear más seccionado pero es lo mismo
public void activity1(View v){ Intent claseAEjecutar = new Intent(); claseAEjecutar.setAction("com.example.objetosintents.ActividadSegunda"); startActivity (claseAEjecutar); }
- Igualmente podemos especificar el nombre del la clase .class
public void activity1(View v){ Intent claseAEjecutar = new Intent(); claseAEjecutar.setClass(this, ActividadSegunda.class); startActivity (claseAEjecutar); }
- Y lo mismo de manera más compacta
public void activity1(View v){ startActivity (new Intent(this,ActividadSegunda.class)); }
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
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(); } }