Usuario:ManuelRomero/Android/Intents

De WikiEducator
Saltar a: navegación, buscar
Road Works.svg Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos.
Ver página de charlas.
Road Works.svg






Intents

ClaseIntent.png

Referencia
http://developer.android.com/reference/android/content/Intent.html
  • Definición de la página oficial


Icon define.gif

Definición

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
  1. Activity.
  2. Service.
  3. ContentProvider.
  4. 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
  1. Component Es el componente de aplicación que queremos que se ejecute
  2. action Indica la acción asociada al Intent. con ella trataremos de encontrar los componetes que llevan a caba esa acción
  3. data Son los datos necesarios para una determinada accion
  4. category forma de agrupar actividades que detallan conciones que pueden hacer
  5. extra Permite dar valores a un objeto Bundle en formato etiqueta-valor para poder pasar varles al componentes que invocquemos
  6. 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

Intent1.png

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

ClaseNueva.png

  • 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

Intent2.png

  1. 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();
 
	}
}