Intents en Android

Tipos y uso de intents




Buenas developers, a continuación aumento el repositorio de código con un tema bastante sencillo, los intents.

Vamos a ver una serie de intents "curiosos" que nos aportarán funcionalidades distintas. Empezamos por el más básico, cambio de actividad con el paso de parámetros, en un proyeco en blanco, he creado 2 actividades :





public class MainActivity extends Activity {

  int numero    = 8;
  String cadena = "Blog ThebestAndroide";

  private Button boton;

  @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      //REFERENCIA BOTON
      boton = (Button) findViewById(R.id.button);
      boton.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              lanzarIntent1(MainActivity.this, cadena, numero);
          }
      });
    }

  public static void lanzarIntent1(Activity activity, String cadena, int numero) {
    String NombreActivity = "segundaActivity";
    Intent intent = new Intent(NombreActivity);
    Bundle bundle = new Bundle();
    bundle.putInt("NUMERO", numero);
    bundle.putString("CADENA", cadena);
    intent.putExtras(bundle);

    activity.startActivity(intent);
  }
}

public class Activity2 extends Activity {

  @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_activity2);

      TextView text1, text2;

      //REFERENCIA OBJETOS XML
      text1 = (TextView) findViewById(R.id.textView2);
      text2 = (TextView) findViewById(R.id.textView3);

      //RECOGER PARÁMETROS
      Bundle extras = getIntent().getExtras();
      if (extras != null) {
        String cadena = extras.getString("CADENA");
        int numero = extras.getInt("NUMERO");
        if (cadena != null) {
          text1.setText("Variable Int : " + numero);
          text2.setText("Variable String : " + cadena);
        }
      }
    }
}






Observamos que la variable NombreActivity tiene el mismo nombre que le ponemos en la etiqueta intent del androidManifest, en el ejemplo hemos pasado 2 tipos de datos en el intent primitivos, ¿Sencillito no? ahora bien, veremos como pasar un objeto. 





¿Cómo pasamos un objeto por medio de un intent?

Podríamos serializar una clase por medio de una interfaz serializable, pero este proceso en Android supone un problema de rendimiento

Para eso usamos la interfad Parcelable, que es específica para serializar objetos y moverlos de actividad a actividad. Así que modificamos nuestro Javabeans para que podamos serializar los objetos.

package intents.thebestandroide.intents;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by makone on 15/03/2015.
 */
public class producto implements Parcelable {
    int id;
    String name;
    String descripcion;

    public producto() {
    }

    public producto(int id, String name, String descripcion) {
        this.id = id;
        this.name = name;
        this.descripcion = descripcion;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public producto (Parcel parcel){
        readToParcel(parcel);
    }

    public static final Parcelable.Creator CREATOR =
            new Parcelable.Creator() {
                public producto createFromParcel(Parcel source) {
                    return new producto(source);
                }
                public producto[] newArray(int size) {
                    return new producto[size];
                }
    };

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(id);
        out.writeString(name);
        out.writeString(descripcion);
    }

    public void readToParcel(Parcel parcel){
        id = parcel.readInt();
        name = parcel.readString();
        descripcion = parcel.readString();
    }
}

Y en nuestras dos activity, cambiamos el código referente a las variables :

public class MainActivity extends Activity {
  private Button boton;

  @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      //REFERENCIA BOTON
      boton = (Button) findViewById(R.id.button);
      boton.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              lanzarIntent1(MainActivity.this);
          }
      });
    }

  public static void lanzarIntent1(Activity activity) {
    String NombreActivity = "segundaActivity";
    Intent intent = new Intent(NombreActivity);

    producto p = new producto();
    p.setId(1);
    p.setName("makone");
    p.setDescripcion("thebestAndroide");

    //Insertamos objeto
    intent.putExtra("producto",p);

    activity.startActivity(intent);
  }
}


public class Activity2 extends Activity {

  @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_activity2);

      TextView text1, text2, text3;

      //REFERENCIA OBJETOS XML
      text1 = (TextView) findViewById(R.id.textView2);
      text2 = (TextView) findViewById(R.id.textView3);
      text3 = (TextView) findViewById(R.id.textView4);

      //RECOGER PARÁMETROS
      Bundle extras = getIntent().getExtras();
      producto p = extras.getParcelable("producto");

      if (extras != null) {
         int numero    = p.getId();
         String nombre = p.getName();
         String desc   = p.getDescripcion();

         text1.setText("Id : " + numero );
         text2.setText("Nombre : " + nombre );
         text3.setText("Descripcion : " + desc );
      }
    }
}




Bien, ahora que ya hemos visto cómo hacer un intent simple con parámetros primitivos, además de un paso de objeto (el paso de arraylist lo he omitido porque para algo se crearon las BBDD) , ahora vamos a ver diversos intents curiosos que aportan funcionalidades distintas :

Abrir dirección web

//la url debe incluir siempre el protocolo
  public static void lanzarIntent1(Activity activity) {
    String url = "http://www.google.es";
    activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
  }





Buscar en Youtube con la app oficial 

  public static void lanzarIntent1(Activity activity) {
    Intent intent = new Intent(Intent.ACTION_SEARCH);
    intent.setPackage("com.google.android.youtube");
    //CADENA PARA BÚSQUEDA
    intent.putExtra("query", "zenet soñar contigo");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    try{

      activity.startActivity(intent);
      } catch (ActivityNotFoundException e) {
        //la app no está instalada
        System.out.println("App youtube no instalada");
      }
    }


Abrir aplicación Google Play con el id de la app
 
  public static void lanzarIntent1(Activity activity) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("market://details?id=cronometroboxeo.com"));
    try {
      activity.startActivity(intent);
    } catch (android.content.ActivityNotFoundException e) {
      //SI HA DADO EXCEPCION PORQUE EL MARKET NO ESTA DISPONIBLE, ABRIMOS NAVEGADOR CON LA RUTA DE LA APP INTERESADA
      activity.startActivity(new Intent(Intent.ACTION_VIEW,
    Uri.parse("https://play.google.com/store/apps/details?id=cronometroboxeo.com")));
      System.out.println("Market no disponible");
    }
  }




Buscar en Google
 
  public static void lanzarIntent1(Activity activity) {
    Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
    intent.putExtra(SearchManager.QUERY, "Thebestandroide");
    activity.startActivity(intent);
  }




Compartir / enviar

public static void lanzarIntent1(Activity activity) {
  Intent intent = new Intent(android.content.Intent.ACTION_SEND);
  intent.setType("text/plain");
  intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Asunto"); 
  intent.putExtra(Intent.EXTRA_TEXT, "Contenido mensaje");
  activity.startActivity(Intent.createChooser(intent, "Compartir usando"));
}




Enviar E-mail
 
  public static void lanzarIntent1(Activity activity) {
    Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:mail@gmail.com"));
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
    emailIntent.putExtra(Intent.EXTRA_TEXT, "body");
    activity.startActivity(Intent.createChooser(emailIntent, "Seleccione una aplicación"));
  }

Agregar contactos 
 
  public static void lanzarIntent1(Activity activity) {
    Intent contactIntent = new Intent(Intent.ACTION_INSERT);
    contactIntent.setType(ContactsContract.Contacts.CONTENT_TYPE);
    contactIntent.putExtra(ContactsContract.Intents.Insert.NAME,"Peter Parker");
    contactIntent.putExtra(ContactsContract.Intents.Insert.EMAIL,"mail@mail.com");
    contactIntent.putExtra(ContactsContract.Intents.Insert.PHONE,"11-7-666-23");
    activity.startActivity(contactIntent);
  }


Guardar en gestores de eventos
 
  public static void lanzarIntent1(Activity activity) {
    Intent intent = new Intent(Intent.ACTION_EDIT);
    intent.setType("vnd.android.cursor.item/event");
    intent.putExtra("allDay", false);
    intent.putExtra("title", "Cita Laura");
    intent.putExtra("description", "Llevar preservativos por si se deja...");
    activity.startActivity(Intent.createChooser(intent, "Seleccione una aplicación"));
  }
 

Reproducir multimedia
 
Hay que procurar indicar el MimeType correcto, vamos el formato según el tipo al que queramos acceder.Puede ser una url remota o un archivo : (file:///sdcard/MUSICA/song.mp3)
 
    public static void lanzarIntent1(Activity activity) {
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(Uri.parse("http://dominio.com/song.mp3"),"audio/mpeg");
      activity.startActivity(intent);
    }


Hacer una llamada
 
Hay que especificar, que para nuestras aplicaciones, en el caso que necesitemos hacer una llamada, para evitar poner el permiso en la app de que esta pueda llamar, usamos ACTION.DIAL.

    //ACTION DIAL NO REQUIERE CALL_PHONE
    public void HacerLLamada(){
      try {
      Intent callIntent;
      callIntent = new Intent(Intent.ACTION_DIAL);
      Resources res = getResources();
      //String text = String.format(res.getString(R.string.telefono)); //PARA TELF EN STRING
      String text = "tel:555-555-555";
      Log.e("formato  llamada ::: ", text.toString());
      callIntent.setData(Uri.parse("tel:"+text));
      startActivity(callIntent);
      } catch (ActivityNotFoundException activityException) {
        Log.e("dialing-example", "Llamada fallida", activityException);
      }
    }  








Compartir Compartir Compartir Compartir