====== Android ====== ===== General ===== ==== Instalación ==== Para desarrollar una aplicación para android necesitaremos tener: - Eclipse - El SDK de Android - Instalar el plugin para eclipse de desarrollo de Android. La web oficial de desarrollo en Android es [[http://android-developers.blogspot.com/index.html]]. ==== Arquitectura ==== La arquitectura de Android está estructurada por capas y cada capa utiliza los servicios de las que tiene por debajo. Las capas empezando por la más baja son: * **El kernel de Linux**, la capa que permite la comunicación con el hardware. * **Librerías nativas**, escritas en C\C++ y compiladas para cada arquitectura de cada teléfono. Entre ellas: * El //surface manager//, el administrador gráfico que gestiona el entorno, las ventanas y las aplicaciones. Interactuar con él es más sencillo que diréctamente con el hardware. * Las librerías de //gráficos 2d y 3d//. * //Códecs// multimedia, así como AAC, MP3, MPEG4... * //SQLite//, que gestiona las bases de datos internas. * El motor html (//webkit//), para mostrar archivos de páginas web. * **El motor de Android**, compuesto básicamente por la //Dalvik VM//, esta es una versión de Java optimizada para móviles diseñada por Google. Esta corre archivos .dex en vez de .jar, pero a su vez también hace uso de algunas librerías de Java. Una comparación con Java es que: * Utiliza la sintaxis de Java5. * El uso de ''doubles'' o ''floats'' es emulado por software. * El uso de threads también es limitado, no se deberían de utilizar más de 2. * Mejor que utilizar el ''finalize'' es utilizar los métodos ''close'' o ''terminate''. * De las librerías de java hay algunas que estan soportadas (''java.awt.font'', ''java.io'', ''java.lang'', ''java.math''...) y otras que no (java.applet, ''java.beans'', ''javax.print'', ''javax.sound''...). * Otras librerías de terceros también son soportadas: ''org.apache.http'', ''orj.json'', ''org.xml.sax'', ''org.xmlpull.v1''. * **El framework de aplicaciones**, utilizado para programar para Android dándonos una serie de bloques de código para utilizar en nuestro desarrollo. Entre ellos encontramos: * El //activity manager//, que controla el ciclo de vida de las aplicaciones. * //Proveedores de contenido//, código para acceder a los datos contenidos en el teléfono (por ejemplo los contactos). * El //resource manager//, que gestiona los elementos de un programa que no son código (imágenes, audio...). * El //location manager//, para conocer la ubicación del teléfono. * El //notification manager//, encargado de mostrar alertas y al usuario. * Las **aplicaciones**, la capa que realmente ve el usuario. {{ fw:android:android_architecture.png?450 |}} ==== El ciclo de vida de una aplicación ==== Android trabaja únicamente con una aplicación a la vez (que no proceso), por ejemplo, al iniciar el sistema se inicia la aplicación Home (con menús, reloj, mensajes para el usuario...); cuando el usuario inicia otra aplicación la Home queda en segundo plano y, por lo tanto, recibe menos "atención". A medida que se van iniciando aplicaciones estas son guardadas en la pila de aplicaciones (//application stack//) por el //activity manager//. El usuario podrá volver a la aplicación anterior como si de una navegación web se tratase. \\ \\ Cada entorno (ventana, aplicación...) está representada por una clase ''Activity''. Una aplicación realmente es una (o más) ''Activity'' enlazada a un proceso Linux, pero la aplicación no queda finalizada aunque el proceso Linux lo esté. \\ \\ Las activities permanecen en un estado controlado por el sistema, no por el programador. Cuando el estado cambia avisa a la activity mediante eventos pudiendo ser las transiciones de la siguiente forma: {{ fw:android:android_activity_lifecycle.png?450 |}} Es decir, se han de implementar los siguientes métodos y el sistema los llamará en el momento adecuado: * ''onCreate'', cuando la activity inicia, sólo se llama una vez. Método adecuado para crear la interficie de usuario. * ''onStart'', indica que la activity va a mostrarse al usuario. * ''onResume'', indica que el usuario ya puede interactuar con la activity. Método adecuado para iniciar sonidos o animaciones. * ''onPause'', se inicia cuando la actividad está apunto de ir a un segundo plano. Aquí se debería guardar el estado interno actual de la aplicación. * ''onStop'', cuando la actividad va a finalizarse (si el sistema tiene suficiente memoria puede no ser llamado nunca). * ''onRestart'', cuando la actividad vuelve a un primer plano. * ''onDestroy'', cuando la actividad va a eliminarse. * ''onSaveInstanceState'' y ''onRestoreInstanceState'' corresponden a métodos para guardar el estado de la interficie de usuario (lo que se está escribiendo en un cuadro de texto y tal), pero en las últimas versiones no es necesario debido a que ya lo hace el sistema por sí solo. Las aplicaciones deberían guardar su estado en el método ''onPause'' debido a que no se sabe si continuarán en ejecución en un futuro. ==== Bloques de desarrollo ==== Existen distintos tipos de bloques que el usuario puede aprovechar (heredando de ellos) en su código: * //Activities//, es una pantalla de usuario. * //Intents//, son algo así como eventos, describen una acción (enviar un mail, hacer una llamada...). Por ejemplo el de enviar un mail, si la aplicación va a enviar un mail llamaría a este intent y el programa receptor arrancaría para enviar dicho mail; al contrario, por ejemplo, sería indicar ser el receptor de este intent, de esa forma cuando una aplicación fuese a enviar un mail avisaría a la tuya. * //Servicios//, programas que se están ejecutando siempre y en segundo plano. Por ejemplo el reproductor de música, se inicia como una Activity pero si cambias de aplicación pasa a ser un servicio que sigue reproduciendo la música. * //Content Providers//, son algo así como bibliotecas\librerías, que engloban código que se puede compartir entre aplicaciones. ==== Permisos ==== En el fichero llamado ''Android-Manifest.xml'' se indica a qué partes del sistema accederá la actividad y será el ''Package Manager'' quien dará esos permisos a partir de la aceptación del usuario. * ''INTERNET'': Acceso a internet. * ''READ_CONTACTS'': Leer pero no escribir en los contactos del usuario. * ''WRITE_CONTACTS'': Escribir pero no leer los contactos del usuario. * ''RECEIVE_SMS'': Monitorear mensajes de texto que lleguen. * ''ACCESS_COARSE_LOCATION'': Saber la localización simple (a partir de antenas o wifi). * ''ACCESS_FINE_LOCATION'': Conocer la posición más concreta, a partir del GPS. Un ejemplo del código en el ''Android-Manifest.xml'' es el siguiente que da la posivilidad de acceder a los SMS: ===== Interfaces de usuario ===== Cuando creamos un proyecto con Eclipse mediante la SDK de Android se generan varios directorios, entre ellos el ''res'' que contiene los recursos. Estos pueden ser archivos xml con textos que se utilicen en la aplicación, o xml que representen layouts (interficie), o sonidos, gráficos, iconos... Cuando se compila el proyecto aparece otro directorio, ''gen'', el cual contiene la clase generada ''R'' que corresponde a los recursos y que, a su vez, contiene los identificadores (variables int estáticas) de los recursos creados. \\ \\ Cuando utilizamos archivos xml como recursos de un proyecto Android estos han de comenzar con la siguiente declaración: ==== Layouts ==== Los layouts son contenederes para objetos hijo, su función es posicionar estos objetos en la pantalla. Los más comunes son: * ''FrameLayout'': Coloca los hijos a partir de la posición //top-left//. * ''LinearLayout'': Coloca los hijos en una columna o fila. * ''RelativeLayout'': Coloca los hijos en relación a las características de otros o del padre. * ''TableLayout'': Organiza los elementos en columnas-filas. Los parámetros comunes para ellos: * ''xmlns:android="http://schemas.android.com/apk/res/android"'': Debería estar definida en la primera tag del XML, define el namespace del XML para Android. * ''android:layout_width=""'' y ''android:layout_height=""'': Para indicar cómo se expandirá. Sus posibles valores son: ''fill_parent'' y ''wrap_content''. Para indicar un layout especial para el momento en el que se gire el teléfono crearemos una nueva carpeta, la ''layout-land'', y en ella insertaremos los xml correspondientes, por ejemplo el ''main.xml''. === Otros contenedores === Pero los layouts no son los únicos contenedores (ni tampoco los primeros que se han de poner en una aplicación). Por ejemplo, si queremos que un entorno tenga scroll añadiremos: