Diego Altamirano Cabrera. Modulo V. Aplicaciones móviles con Android. Introducción. Android es un sistema operativo libre basado en Linux y orientado a dispositivos móviles, como teléfonos inteligentes y tablets. Debido a las características del proyecto y gracias al software libre, el sistema operativo Android ha ido comiendo terreno a otros sistemas operativos para móviles y se ha situado en el sistema operativo más usado por usuarios y desarrolladores. Debido a su gran demanda es importante formar a profesionales en el sector de la movilidad y concretamente en el desarrollo de aplicaciones móviles de última generación. Por ello, el objetivo de este curso es formar a personas aptas en el desarrollo de aplicaciones móviles en la plataforma Android. Que sean no solo capaces de desarrollar sistemas en esta plataforma sino también de poder monetizarlos mediante la tienda de aplicaciones Google Play. 1.1 Android. Android es un sistema operativo móvil basado en Linux, que junto con aplicaciones middleware está enfocado para ser utilizado en dispositivos móviles como teléfonos inteligentes, tabletas, Google TV y otros dispositivos. Es desarrollado por la Open Handset Alliance, la cual es liderada por Google. Este sistema por lo general maneja aplicaciones como Market (Marketing) o su actualización, PlayStore. Fue desarrollado inicialmente por Android Inc., una firma comprada por Google en 2005. Es el principal producto de la Open Handset Alliance, un conglomerado de fabricantes y desarrolladores de hardware, software y operadores de servicio. Las unidades vendidas de teléfonos inteligentes con Android se ubican en el primer puesto en los Estados Unidos, en el segundo y tercer trimestres de 2010, con una cuota de mercado de 43,6% en el tercer trimestre. A nivel mundial alcanzó una cuota de mercado del 50,9% durante el cuarto trimestre de 2011, más del doble que el segundo sistema operativo (iOS de iPhone) con más cuota. Tiene una gran comunidad de desarrolladores escribiendo aplicaciones para extender la funcionalidad de los dispositivos. A la fecha, se han sobrepasado las 400.000 aplicaciones (de las cuales, dos tercios son gratuitas) disponibles para la tienda de aplicaciones oficial de Android: Google Play, sin tener en cuenta aplicaciones de otras tiendas no oficiales para Android, como pueden ser la App Store de Amazon o la tienda de aplicaciones Samsung Apps de Samsung. Google Play es la tienda de aplicaciones en línea administrada por Google, aunque existe la posibilidad de Diego Altamirano Cabrera. obtener software externamente. Los programas están escritos en el lenguaje de programación Java. No obstante, no es un sistema operativo libre de malware, aunque la mayoría de ello es descargado de sitios de terceros. El anuncio del sistema Android se realizó el 5 de noviembre de 2007 junto con la creación de la Open Handset Alliance, un consorcio de 78 compañías de hardware, software y telecomunicaciones dedicadas al desarrollo de estándares abiertos para dispositivos móviles. Google liberó la mayoría del código de Android bajo la licencia Apache, una licencia libre y de código abierto. La estructura del sistema operativo Android se compone de aplicaciones que se ejecutan en un framework Java de aplicaciones orientadas a objetos sobre el núcleo de las bibliotecas de Java en una máquina virtual Dalvik con compilación en tiempo de ejecución. Las bibliotecas escritas en lenguaje C incluyen un administrador de interfaz gráfica (surface manager), un framework OpenCore, una base de datos relacional SQLite, una Interfaz de programación de API gráfica OpenGL ES 2.0 3D, un motor de renderizado WebKit, un motor gráfico SGL, SSL y una biblioteca estándar de C Bionic. El sistema operativo está compuesto por 12 millones de líneas de código, incluyendo 3 millones de líneas de XML, 2,8 millones de líneas de lenguaje C, 2,1 millones de líneas de Java y 1,75 millones de líneas de C++. Diego Altamirano Cabrera. 1.2 Arquitectura Diagrama de arquitectura de Android. Los componentes principales del sistema operativo de Android (cada sección se describe en detalle): Aplicaciones: las aplicaciones base incluyen un cliente de correo electrónico, programa de SMS, calendario, mapas, navegador, contactos y otros. Todas las aplicaciones están escritas en lenguaje de programación Java. Marco de trabajo de aplicaciones: los desarrolladores tienen acceso completo a los mismos APIs del framework usados por las aplicaciones base. La arquitectura está diseñada para simplificar la reutilización de componentes; cualquier aplicación puede publicar sus capacidades y cualquier otra aplicación puede luego hacer uso de esas capacidades (sujeto a reglas de seguridad del framework). Este mismo mecanismo permite que los componentes sean reemplazados por el usuario. Bibliotecas: Android incluye un conjunto de bibliotecas de C/C++ usadas por varios componentes del sistema. Estas características se exponen a los desarrolladores a través del marco de trabajo de aplicaciones de Android; algunas son: System C library (implementación biblioteca C estándar), bibliotecas de medios, bibliotecas de gráficos, 3D y SQLite, entre otras. Diego Altamirano Cabrera. Runtime de Android: Android incluye un set de bibliotecas base que proporcionan la mayor parte de las funciones disponibles en las bibliotecas base del lenguaje Java. Cada aplicación Android corre su propio proceso, con su propia instancia de la máquina virtual Dalvik. Dalvik ha sido escrito de forma que un dispositivo puede correr múltiples máquinas virtuales de forma eficiente. Dalvik ejecuta archivos en el formato Dalvik Executable (.dex), el cual está optimizado para memoria mínima. La Máquina Virtual está basada en registros y corre clases compiladas por el compilador de Java que han sido transformadas al formato.dex por la herramienta incluida "dx". Núcleo Linux: Android depende de Linux para los servicios base del sistema como seguridad, gestión de memoria, gestión de procesos, pila de red y modelo de controladores. El núcleo también actúa como una capa de abstracción entre el hardware y el resto de la pila de software. 1.3Diseño y desarrollo Android, al contrario que otros sistemas operativos para dispositivos móviles como iOS o Windows Phone, se desarrolla de forma abierta y se puede acceder tanto al código fuente85 como al listado de incidencias donde se pueden ver problemas aún no resueltos y reportar problemas nuevos. El que se tenga acceso al código fuente no significa que se pueda tener siempre la última versión de Android en un determinado móvil, ya que el código para soportar el hardware (controladores) de cada fabricante normalmente no es público, así que faltaría un trozo básico del firmware para poder hacerlo funcionar en dicho terminal, y porque las nuevas versiones de Android suelen requerir más recursos, por lo que los modelos más antiguos quedan descartados por razones de memoria (RAM), velocidad de procesador, etc. En sus comienzos, Android era eminentemente un sistema operativo pensado para usar con teclado, y gracias a un cursor poder navegar entre las aplicaciones. Desde su comienzo, Android ha sido altamente personalizable. Poco después, antes del lanzamiento del primer teléfono Android, esta filosofía cambió para convertirse en eminentemente táctil, y poder competir contra el recién lanzado iPhone. Diego Altamirano Cabrera. 2.1 Arquitectura de una aplicación Android. La plataforma Android nos proporciona diferentes componentes a la hora de programar aquello que queremos que haga nuestra aplicación. Cuatro son los elementos básicos que tenemos que conocer: Activity: Es cada una de las pantallas que conforman nuestra aplicación. En ella recae la responsabilidad de presentar los elementos visuales y reaccionar a las acciones del usuario. Toda Activity se inicia como respuesta a un Intent. Intent: Este tipo de componente es el que utiliza Android para moverse de una pantalla a otra. Se puede entender como aquello que la aplicación desea hacer. Cuando se lanza un Intent el sistema busca qué Activity es capaz de dar respuesta a ese Intent y elige la más adecuada. Service: Es una tarea que se ejecuta durante periodos prolongados y en el background de la aplicación. No cuenta con una interfaz por lo que el usuario no interactúa de forma directa con este componente. Un ejemplo simple de un Service lo podemos encontrar en una aplicación que necesite ir capturando la posición del GPS cada cierto tiempo y nos notifique cuando ya estemos cerca de nuestro destino; mientras tanto el usuario puede utilizar su dispositivo para realizar otras tareas. Content Provider: Es un almacén de información provisto desde una API mediante el cual, el usuario y la aplicación pueden accesar al contenido sin necesidad de conocer los detalles del almacenamiento. Dependiendo del autor del libro o de la fuente consultada, podrán también encontrar que algunos hablan de un quinto elemento llamado Broadcast Receivers, que se utilizan para recibir y reaccionar ante ciertas notificaciones broadcast. Estos, al igual que los Service, no poseen una interfaz de usuario y pueden reaccionar ante eventos como el cambio de zonas horarias, llamadas, nivel de batería, etc. Todos los objetos de tipo Receiver heredan de la clase BroadcastReceiver. Hay que aclarar que no todas las aplicaciones tienen que tener estos cuatro elementos; en la mayoría de los casos nos encontraremos con aplicaciones que tengan una mezcla de algunos de ellos, pero eso sí, al menos ha de tener uno de los cuatro. No hay que olvidar que los elementos de Android son finalmente objetos y por lo tanto estos cuatro también lo son. Su comportamiento está definido en su correspondiente clase base y todo elemento que queramos implementar será una subclase del elemento original. Esto lo vamos a lograr por medio de la herencia, una característica básica de Java, y que nos evitará tener que volver a implementar aspectos comunes en todos los objetos del mismo tipo, y poder al mismo tiempo, personalizar su comportamiento tanto como lo necesite nuestra aplicación por medio de la sobre escritura de los métodos de la clase padre. Todos los elementos que vaya a utilizar nuestra aplicación debemos declararlos en el archivo AndroidManifest.xml . Diego Altamirano Cabrera. 2.2 Los procesos en Android En la mayoría de los casos, una aplicación Android se ejecuta en su propio proceso de Linux. Este proceso es creado para la aplicación cuando la arrancamos y seguirá corriendo hasta que no sea necesario y el sistema reclame recursos para otras aplicaciones y se los de a éstas. Así es, el tiempo de vida de un proceso en Android es manejada por el sistema operativo, basándose en las necesidades del usuario, los recursos disponibles, etc. Si tenemos una aplicación que está consumiendo muchos recursos y arrancamos otra nueva aplicación, el sistema operativo probablemente le diga a la aplicación que se queda en segundo plano que libere todo lo que pueda, y si es necesario la cerrará. En Android los recursos son normalmente muy limitados y por eso el sistema operativo tiene más control sobre las aplicaciones que en programas de escritorio. Para determinar qué procesos eliminar ante un escenario dónde el dispositivo tenga poca batería u otros en los que sea de relevante importancia administrar los recursos, Android les asigna una prioridad a cada uno de ellos basándose en la siguiente jerarquía: Foreground Process: Es la aplicación que contiene la actividad ejecutada en primer plano en la pantalla del usuario y con la cuál está interactuando ahora mismo (Se ha llamado a su método onResume()). Por lo regular habrá muy pocos procesos de este tipo corriendo a la vez en el sistema y son aquellos que se eliminarán como última opción si la memoria es tan baja que ni matando al resto de procesos tenemos los recursos necesarios. Visible Process: Es un proceso que aloja una Activity que no se está ejecutando en primer plano (es decir, su método onPause() ha sido llamado). Un ejemplo puede ser la aplicación de correo en la cuál demos click en algún enlace de interés que nos lance el navegador, este pasaría a ser el Foreground Process dejando a la aplicación de correo en el concepto de Visible Process. Este tipo de procesos se cerrarán únicamente cuando el sistema no tenga los recursos necesarios para mantener corriendo todos los procesos que estén en primer plano. Service Process: Son aquellos que corren cuando un Service ha sido invocado. Estos procesos hacen cosas en segundo plano que normalmente son importantes para el usuario (conexión con servidores, actualización del GPS, reproductor de música, etc.), el sistema nunca va a liquidar un servicio a menos que sea necesario para mantener vivos todos los Visible y Foreground. Background Process: Es un proceso que contiene una Activity que actualmente no es visible por el usuario y que ya no tienen demasiada importancia. Por ejemplo, los programas que arrancó el usuario hace tiempo y no los ha vuelto a usar, pasan a estar en background. Por eso es importante que cuando nuestra aplicación pase a Background, el sistema libere, en la medida de lo posible, todos los recursos que pueda para que su rendimiento sea óptimo. Diego Altamirano Cabrera. Empty Process: Es un proceso que no aloja ningún tipo de componente. Su razón de ser es el de tener una caché disponible para la próxima aplicación que lance el usuario. Es común que el sistema elimine este tipo de procesos con frecuencia para así poder obtener memoria disponible. 2.3 Ciclo de vida de una aplicación Android Aunque el sistema operativo sea el que en cualquier momento pueda pausar, parar o destruir nuestra aplicación según las necesidades de recursos del dispositivo, nosotros debemos aprender a controlar todos estos eventos para hacer nuestras aplicaciones robustas. Diego Altamirano Cabrera. Pasemos a explicar cada uno de los métodos: onCreate(): Se dispara cuando la Activity es llamada por primera vez. Aquí es donde debemos crear la inicialización normal de la aplicación, crear vistas, hacer los bind de los datos, etc. Este método te da acceso al estado de la aplicación cuando se cerró. Después de esta llamada siempre se llama al onStart(). onRestart(): Se ejecuta cuando tu Activity ha sido parada, y quieres volver a utilizarla. Si ves el diagrama podrás ver que después de un onStop() se ejecuta el onRestart() e inmediatamente llama a un onStart(). onStart(): Se ejecuta cuando la Activity se está mostrando apenas en la pantalla del dispositivo del usuario. onResume(): Se ejecuta una vez que la Activity ha terminado de cargarse en el dispositivo y el usuario empieza a interactuar con la aplicación. Cuando el usuario ha terminado de utilizarla es cuando se llama al método onPause(). onPause(): Se ejecuta cuando el sistema arranca una nueva Activity que necesitará los recursos del sistema centrados en ella. Hay que procurar que la llamada a este método sea rápida ya que hasta que no se termine su ejecución no se podrá arrancar la nueva Activity. Después de esta llamada puede venir un onResume() si la Activity que haya ejecutado el onPause() vuelve a aparecer en primer plano o un onStop() si se hace invisible para el usuario. onStop(): Se ejecuta cuando la Activity ya no es visible para el usuario porque otra Activity ha pasado a primer plano. Si vemos el diagrama, después de que se ha ejecutado este método nos quedan tres opciones: ejecutar el onRestart() para que la Activity vuelva a aparecer en primer plano, que el sistema elimine este proceso porque otros procesos requieran memoria o ejecutar el onDestroy() para apagar la aplicación. onDestroy(): Esta es la llamada final de la Activity, después de ésta, es totalmente destruida. Esto pasa por los requerimientos de memoria que tenga el sistema o porque de manera explícita el usuario manda a llamar este método. Si quisiéramos volver a ejecutar la Activity se arrancaría un nuevo ciclo de vida. Diego Altamirano Cabrera. Fuentes: developer.android.com wikipedia.es gdroid.com.mx