Bienvenidos sean a este post, en el caso de hoy dejaremos un poco a la app Asteroides de costado para centrarnos en un tema, en este caso intenciones.

Anuncios

Las intenciones son la voluntad de poder realizar alguna accion o tarea, estas pueden ser actividades, servicios o una aplicacion diferente. Hay dos tipos de intenciones:

  • Intenciones explicitas, son las que se indican que componente se debe lanzar, es decir las actividades utilizadas hasta ahora en nuestras apps (Asteroides y MisLugares)
  • Intenciones implicitas, son aquellas mas de tipo abstractas donde nosotros podemos tener una idea no concreta como “querer tomar una foto” o “querer acceder a una web”, en este caso el Sistema evaluara las posibilidades y le consultara al usuario sobre cual ejecutar de todas las posibles.

No se preocupen por el segundo caso mas adelante veremos algunos casos mas concretos, las intenciones permiten el paso de informacion e intercomunicacion entre distintos componentes. Las intenciones se ejecutan cuando ocurre cualquiera de los siguientes casos:

  • Lanzar una actividad (startActivity y startActivityForResult)
  • Lanzar un servicio (startService)
  • Lanzar un tipo de anuncio broadcast (sendBroadcast)
  • Conectarnos con un servicio (bindService)

Cuando la intencion es creada, esta tiene informacion importante para que el sistema trate adecuadamente la intencion o para el componente que reciba la intencion. Esta consta de las siguientes partes:

  • Nombre del componente, identifica al componente que queremos lanzar, esto es lo que llamamos intencion explicita
  • Accion, una cadena de caracteres donde indicamos la accion a realizar

En este ultimo caso, intent define una serie de constantes para acciones genericas, veamos la siguiente tabla para ver algunos:

ConstanteComponente a lanzarAccion
ACTION_CALLActividadInicia una llamada de telefono
ACTION_EDITActividadVisualiza datos para su edicion
ACTION_MENUActividadInicia como actividad principal de una tarea (Sin enviar o recibir datos
ACTION_SYNCActividadSincroniza datos en un servidor con los del dispositivo movil
ACTION_BATTERY_LOWReceptor de anunciosAdvertencia de bateria baja
ACTION_HEADSET_PLUGReceptor de anunciosIndicador de conexion o desconexion de auriculares
ACTION_SCREEN_ONReceptor de anunciosSe ha activado la pantalla
ACTION_TIMEZONE_CHANGEDReceptor de anunciosIndica el cambio de la zona horaria

Las acciones tambien pueden ser definidas por nosotros pero en lugar de usarlo directamente como se ve en la tabla debera tener todo el paquete, por ejemplo: com.tinchicus.asteroides.MOSTRAR_PUNTUACIONES

Anuncios
  • Categoria, complementa a la accion e indica informacion adicional sobre el tipo de componente a ser lanzado ahora veamos algunas categorias que pueden ser utilizadas por intent
ConstanteSignificado
CATEGORY_BROWSABLELa actividad lanzada puede ser utilizada con seguridad por el navegador
CATEGORY_HOMEMuestra la pantalla de inicio, la primera pantalla que ve el usuario
CATEGORY_LAUNCHERPuede ser la actividad inicial de una tarea y se muestra en el lanzador de aplicaciones en el nivel superior
CATEGORY_PREFERRENCELa actividad a lanzar es un panel de preferencias

Como dijimos antes estas son complementos de las acciones, por ejemplo indicaremos ACTION_MAIN a las actividades que son puntos de entrada y a su vez complementarla con CATEGORY_LAUNCHER para que la misma se vea en la pantalla de inicio

  • Datos, referencia a los datos con que trabajaremos y estos deben ser enviados por medio de URI, Indicador de Recursos Uniforme, por sus siglas en ingles. Ejemplos de URI son: tel:01155556666, https://tinchicus.com/, para estos casos siempre es util indicar el MIME (Multipurpose Internet Mail Extensions) para manipular correctamente el tipo de dato, ejemplos de identificadores son: text/xml, image/jpeg, etc.
  • Extras, informacion adicional que sera recibida por el componente. Este tipo de informacion lo hemos visto cuando estudiamos actividades y por medio del metodo putExtra() enviabamos la informacion hacia la actividad por ejemplo podriamos usar: intent.putExtra(“nombre”,”Martin”); donde el primer campo sera el identificador y el segundo el dato. Les recomiendo este post para ver mas sobre esto

Ahora veamos un pequeño ejemplo para entender sobre las intenciones, abramos nuestro Android Studio y seleccionemos Start a new Android Studio project

android00

Una vez seleccionado nos aparecera el siguiente cuadro

android01
Anuncios

Aca deben modificar Application name por Intenciones, y en Company domain pueden agregar example.org o si disponen de uno propio como es mi caso tambien pueden utilizarlo, el resto debe quedar como aparece y pulsar Next para que aparezca el siguiente cuadro

android02

Aca deben dejarlo con la version mas baja disponible de API, en lo personal les recomiendo esta API y seleccionen Phone and Tablet solamente tal como se ve en la imagen, luego pulsen Next y pasaremos al siguiente cuadro

android03

En este cuadro deben seleccionar Empty Activity, esto nos creara una actividad basica pero vacia, pulsen Next y pasaremos al siguiente cuadro

android04

Aca deberia aparecer como se ve en la imagen, en caso contrario deben dejarlo como se ve en la imagen, pulsan Finish y comenzara la creacion de nuestra app.

Una vez finalizada ingresaremos al editor de Android Studio para modificar el layout generado automaticamente, para eso debemos abrir el archivo activity_main.xml y seleccionar la solapa Text donde tendremos el siguiente codigo fuente:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".MainActivity">

    <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="Hello World!"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
Anuncios

Lo reemplazaremos por el siguiente codigo:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_height="match_parent"
     android:layout_width="match_parent"
     android:orientation="vertical"
     tools:context=".MainActivity">
    <Button
         android:id="@+id/pgWeb"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="abrir pagina web"
         android:onClick="paginaWeb" />
    <Button
         android:id="@+id/llamada"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="llamada telefonica"
         android:onClick="llamadaTelefono" />
    <Button
         android:id="@+id/mapas"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="google maps"
         android:onClick="googleMaps" />
    <Button
         android:id="@+id/foto"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="tomar foto"
         android:onClick="tomarFoto" />
    <Button
         android:id="@+id/correo"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="mandar correo"
         android:onClick="mandarCorreo" />
</LinearLayout>

Como pueden ver cambiamos el tipo de layout, ahora es LinearLayout, y agregamos cinco botones para crear las actividades con las intenciones, ahora no se preocupen por el evento onClick porque si bien ahora puede generar un error lo solucionaremos en nuestra siguiente modificacion. Ahora vamos a nuestra clase MainActivity para agregar los metodos faltantes, veamoslo a continuacion:

public void paginaWeb(View view){
    Intent i = new Intent(Intent.ACTION_VIEW,
            Uri.parse("https://tinchicus.com"));
    startActivity(i);
}

public void llamadaTelefono(View view){
    Intent i = new Intent(Intent.ACTION_CALL,
            Uri.parse("tel:1146972305"));
    startActivity(i);
}

public void googleMaps(View view){
    Intent i = new Intent(Intent.ACTION_VIEW,
            Uri.parse("geo:-32.0688462,-64.5754776"));
    startActivity(i);
}

public void tomarFoto(View view){
    Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
    startActivity(i);
}

public void mandarCorreo(View view){
    Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("text/plain");
    i.putExtra(i.EXTRA_SUBJECT, "asunto");
    i.putExtra(i.EXTRA_TEXT,"texto del correo");
    i.putExtra(i.EXTRA_EMAIL, new String[] {"mrbogusa@gmail.com"});
    startActivity(i);
}
Anuncios

Como pueden ver creamos las actividades para cada boton, observen como dependiendo la actividad utilizamos el intento correspondiente, los mas interesantes para mi son de las funciones tomarFoto() donde utilizaremos una constante desde el paquete para el accionar de la camara, el otro es mandarCorreo() porque por medio de setType() definimos el tipo de MIME y despues con los metodos putExtra() enviamos la informacion para armar el mail, ahora solo nos resta una modificacion mas para poder probar nuestra app, pero antes veamos como quedo finalmente la clase MainActivity:

package org.example.intenciones;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

    public void paginaWeb(View view){
        Intent i = new Intent(Intent.ACTION_VIEW,
                Uri.parse("https://tinchicus.com"));
        startActivity(i);
    }

    public void llamadaTelefono(View view){
        Intent i = new Intent(Intent.ACTION_CALL,
                Uri.parse("tel:1155556666"));
        startActivity(i);
    }

    public void googleMaps(View view){
        Intent i = new Intent(Intent.ACTION_VIEW,
                Uri.parse("geo:-32.0688462,-64.5754776"));
        startActivity(i);
    }

    public void tomarFoto(View view){
        Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
        startActivity(i);
    }

    public void mandarCorreo(View view){
        Intent i = new Intent(Intent.ACTION_SEND);
        i.setType("text/plain");
        i.putExtra(i.EXTRA_SUBJECT, "asunto");
        i.putExtra(i.EXTRA_TEXT,"texto del correo");
        i.putExtra(i.EXTRA_EMAIL, new String[] {"mrbogusa@gmail.com"});
        startActivity(i);
    }
}
Anuncios

Ahora procedamos a abrir el archivo AndroidMainfest.xml para agregar la siguiente linea:

<uses-permission android:name="android.permission.CALL_PHONE" />

Nuestro archivo quedara de la siguiente forma:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="org.example.intenciones">

    <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category
                     android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.CALL_PHONE" />

</manifest>

Esta linea nos permitira hacer llamadas por medio de nuestra app, ahora si pasemos a probar nuestra app, veamoslo por medio del siguiente video

Como pueden ver en el video a medida que vamos llamando a cada una de nuestras actividades se ejecutan las aplicaciones relacionadas a cada una de nuestras intenciones, es decir la pagina web, hacer una llamada, abrir google maps, etc. y como dijimos antes y vimos en el post de Actividades, la intencion puede ser explicita llamando directamente a la actividad, en ese caso una vista, o implicita como en este ejemplo donde nosotros le damos una constante y la app se encarga de llamar a la aplicacion o al servicio relacionado para poder ejecutar dicha actividad.

Anuncios

En resumen, hoy hemos visto que son las intenciones, para que sirven, cuales son sus funciones y un ejemplo para poner en practica los intenciones implicitas. Espero les haya gustado, sigueme en Twitter, Facebook o Google+ para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00