jueves, 3 de noviembre de 2011

Ciclo de vida de una actividad en Android

Algo esencial a la hora de programar aplicaciones, es saber de que manera se comportará nuestra aplicación a la hora de ejecutarla. Para ello, es imprescindible saber su ciclo de vida, algo necesario para saber dónde inicializar variables, crear o destruir objetos, o simplemente qué hacer cuando la aplicación llegue a su fin.

Las actividades son gestionadas por el sistema mediante una pila de actividades. Cuando una nueva aplicación aparece, esta se situa al principio de dicha pila pasando a ser la actividad en ejecución (la actividad anterior no volverá a primer plano hasta que esta no termine).

Según la documentación de Android, una actividad podemos encontrarla en 4 estados, aunque bajo mi punto de vista sólo son 3, ya que el cuarto es una combinación del segundo y tercero:

  1. Activa: cuando la actividad está la primera en la pila de actividades y es la que está en primer plano en el dispositivo.
  2. En pausa: cuando la actividad pierde el foco pero es todavía visible (se le superpone otra actividad en modo pantalla parcial o modo transparente). Esta actividad continua viva, manteniendo toda la información de estado, miembros, etc permaneciendo unida al gestor de ventanas. Si el sistema necesita memoria podrá matar la actividad. 
  3. Detenida:cuando hay otra aplicación tapando por completo a la activa (por ejemplo entra una llamada), la aplicación pasa a estar detenida. Dicha aplicación mantiene la información de estado, miembros, etc pero ya no está visible para el usuario, por lo que el sistema, en caso de necesitar memoria, puede eliminarla. 
  4. Pausa / Detenida: el sistema puede eliminar de la memoria una actividad en uno de estos dos estado preguntando si queremos finalizarla nosotros mismo o eliminarla el mismo sin preguntar. Cuando la actividad vuelva a estar visible, será necesario reiniciarla y restaurarla a su estado anterior.
 En el siguiente diagrama vemos como se gestionan estos estados y como se pasa de uno a otro:


Cuando lanzamos la aplicación, se llama al método OnCreate(), donde inicializaremos los componentes esenciales de nuestra actividad (llamaremos a setContentView() para definir el diseño de la interfaz de usuario, crearemos las vistas, enlazaremos los datos, etc)

Inmediatamente se llama al método OnStart() justo antes de que la actividad sea visible en el terminal. A partir de aquí, puede llamarse al método OnResume() o al método OnStop(), dependiendo de la focalización o no de la actividad.

El método OnResume() se llama justo antes de que el usuario comience a interactuar con la actividad. 

Después de este método se ejecuta el OnPause(). Este método se llama cuando el sistema está a punto de levantar otra actividad. Este método se utiliza normalmente para guardar cambios sin salvar, detener animaciones y otras cosas que puedan consumir recursos, etc. Este método debe ejecutarse rápidamente, ya que hasta que no concluya, el sistema no podrá levantarse la nueva actividad. A partir de aquí, puede llamarse al método OnResume() si la actividad vuelve de nuevo a primer plano, o llamar al método OnStop() si se convierte en invisible para el usuario.

El método OnStop() se ejecuta cuando la actividad ya no es visible por el usuario debido a que está siendo destruida por el sistema o porque otra actividad se ha reanudado y se ha colocado encima. A partir de aquí, solo nos quedan tres opciones: llamar al método OnRestart() si queremos que la aplicación vuelva a primer plano, que el sistema la elimine por necesidad de memoria, o ejecutar el método OnDestroy() si queremos cerrar la actividad.

El método OnDestroy() lo podemos llamar nosotros explícitamente porque queremos destruir la actividad o puede llamarlo el sistema si necesita memoria y está destruyendo actividades para conseguirlo. A partir de aquí, la actividad estará totalmente eliminada.

Si tenemos esto en cuenta a la hora de programar, nos ahorraremos muchos fallos a la hora de ejecutar nuestra aplicación.

Maikel.

Componentes de una aplicación Android

Los componentes que usaremos en una aplicación Android son los siguientes:
  • Activity: una activity es una pantalla de nuestra aplicación. Aquí insertaremos nuestros botones, cajas de texto, etc e interactuaremos con nuestra aplicación. Estas actividades pueden estar en primer o segundo plano.
  • Content Providers: permite acceder a los datos de forma controlada entre las aplicaciones, es decir, Android nos provee un almacén donde las aplicaciones pueden leer o modificar la información de cualquier aplicación (siempre y cuando las aplicaciones tengan permiso para hacerlo) como por ejemplo los contactos del teléfono. El almacén físico de la información puede ser desde el propio teléfono (memoria interna, SDcard, SQLite) hasta sitios remotos (mediante sockets).
  • Services: análogo a un servicio de windows. No tienen interfaz gráfica y estan corriendo en segundo plano. Un ejemplo sería el servicio de recepción de correo.
  • Broadcast Receivers: este componente es parecido a los servícios. Está latente esperando alguna notificación o evento por parte del sistema o de cualquier otra aplicación para desencadenar alguna acción. Es un listener sin pertenecer a ninguna aplicación en concreto. Un ejemplo de este componente puede ser el aviso de que se ha insertado una tarjeta de memoria, que una aplicación ha terminado de descargarse, etc.
  • Intents: las comunicaciones entre componentes de una misma aplicación o entre distintas aplicaciones se realizan a través de este componente. El sistema es quien controla estas comunicaciones y es el encargado de llevarlas a cabo o no. Estos intents pueden lanzar un servicio, levantar otra actividad, etc pero siempre es el sistema quien decidirá si hacerlo o no y mediante que aplicación ejecutarlo. Por ejemplo, si nuestra aplicación debe hacer uso en algún momento de la cámara de fotos, habrá un intents que solicitará al sistema esta necesidad y él mismo decidirá o no (dependiendo si la aplicación tiene permiso) levantar la actividad de capturar foto de la cámara. Mediante este control, no tenemos que volver a definir una función para el uso de la cámara, sino que utilizaremos una ya creada optimizando el código.
Esto es una pequeña pincelada de cada componente, cuando empecemos a programar, seguro que nos queda un poco más claro el uso de cada uno.


Maikel.

    miércoles, 2 de noviembre de 2011

    Estructura de un proyecto Android

    Cuando creamos un nuevo proyecto para android, nos encontramos con esta estructura:



    ¿Qué contiene cada carpeta?:

    SRC: esta carpeta contiene las clases y paquetes de nuestra aplicación, en definitiva, todo el código fuente que nosotros generemos. 

    GEN: esta carpeta almacena código autogenerado al compilar el proyecto. Lo más importante de aquí es el fichero R.java, donde vamos a tener identificadores de todos los recursos que disponemos en nuestra aplicación. Mediante esta clase, podremos acceder a dichos recursos en nuestra aplicación a través de ella mediante R.”clase”.”objeto”. 

    Android x.x.x: almacena las clases del SDK de Android de la versión que hayamos indicado en el target al comenzar el proyecto.

    RES: almacena todos los recursos de la aplicación, como iconos, imágenes, vídeos, cadenas de  valores,  layouts (que son componentes gráficos definidos en XML (estos componentes también se pueden definir mediante Java)), etc. 

    Las carpetas drawable-ldpi, drawable-mdpi y drawable-hdpi almacenarán las imágenes de nuestra aplicación dependiendo si la queremos en baja, media o alta resolución (low, medium, high)
    La carpeta “layouts” contendrá tantos ficheros como pantallas tenga nuestra aplicación. Almacena, por tanto, los ficheros de definición de nuestras interfaces gráficas.
    La carpeta “values” almacenará recursos de textos, estilos, etc.
    La carpeta RES al compilarse, genera un archivo R.java en la carpeta “GEN” con todo el contenido de dicha carpeta.

    AndroidManifest.xml: es un fichero XML esencial en un proyecto Android, ya que contiene información necesaria del proyecto, como el nombre del paquete JAVA de la aplicación, los componentes (actividades, servicios, broadcast receivers y content providers), permisos, API de Android, etc.

    ASSETS: contiene otros ficheros de configuración pero que no generarán código en el fichero R.

    BIN: contiene una carpeta COM, que almacena el compilado de Java con los .class.

    El fichero DEX es otra compilación realizada por Android a partir de la carpeta COM para que la Dalvik (la máquina virtual de Android) pueda ejecutarlo
    El APK es un paquete de todo lo que contiene el BIN. Este fichero es el que necesitamos para instalar la aplicación en el teléfono.

    Se puede profundizar mucho más en cada fichero, como se utiliza, etc, pero creo que a partir de aquí, podemos tener una idea un poco clara de cómo se estructura nuestra aplicación. A partir de aquí, solo queda empezar a programar.

    Maikel.