“Demostración de los recursos de sistema en la plataforma Android”
ELO330 – Programación de Sistemas
08-04-2012
Integrantes:
Andrés Llico G. 2603043-9
Sebastian Zúñiga F. 2721065-1
Guillermo Plaza H. 2521047-6
1
Introducción:
Hoy en día el desarrollo sobre plataformas móviles se ha visto fuertemente impulsado por el avance tecnológico que ha permitido contar un hardware con altas prestaciones. Con ello han surgido nuevos lenguajes de programación para hacer uso de estos recursos, entre ellos se encuentra uno que se sienta sobre las bases de Linux y Java, y que ha entrado con fuerza en el mercado móvil: Android. Es por ello, y enmarcado en los tópicos que abarca esta asignatura, se busca dar a conocer los recursos que ofrece este lenguaje.
2
Resumen:
Android es un lenguaje basado en Linux, que utiliza un compilador cruzado para llevar el código Java a bytecode Android. Es por ello que el desarrollo sobre esta plataforma es escrito en lenguaje Java, y se cuentan con los recursos que éste dispone, más aquellos que incorpora Android. Entre ellos podemos encontrar: creación, transmisión y recepción de datos mediante sockets; creación de hebras; y administración de tareas asincrónicas, entre otros. Y a modo de demostración, se implementará la Tarea 3 de la asignatura en dispositivos con Android.
3
Sobre Android:
3.1
Introducción:
Android es un sistema operativo móvil basado en linux, desarrollado por Open Handset Alliance, el cual es liderada por Google. Las aplicaciones del sistema operativo se ejecutan sobre un framework java de aplicaciones orientadas a objetos sobre el nucleo de bibliotecas de java en una maquina virtual Dalvik con compilación en tiempo de ejecución. Dalvik esta optimizada para el uso de poca memoria y permitir la ejecución de varias maquinas virtuales simultáneamente, delegando al sistema operativo el soporte de aislamiento de procesos, gestión de memoria e hilos.
Las bibliotecas de Android, que están escritas en C, incluyen un administrador de interfaz gráfica y un framework OpenCore, que contiene el manejo de tipos de archivos, protocolos de red, codecs, manipulación de máquinas multimedia, entre otros. También posee una base de datos relacional SQLite, una API gráfica OpenGL, un motor de renderizado WebKit, un motor gráfico SGL, SSL y una biblioteca estándar de C.
3.2 Similitudes y diferencias entre Android y Java:
Primero que todo hay que desmentir el hecho de que Android esta basado y que se ejecuté en Java. Android es un dispositivo basado en Linux, que con compilación cruzada compila de código Java a código de bytes nativo de Android. De esta forma son solo las aplicaciones las desarrolladas en Java, pero al ejecutarse en Android este las compila a su propio lenguaje. Si bien es posible tener Java VM para un teléfono con Android, una aplicación creada con el SDK de Android no se ejecuta en Java cuando se ejecuta en el dispositivo.
3.2.1 Desarrollando una aplicación
Al desarrollar una aplicación para Android nos encontramos con grandes similitudes con realizar una aplicación Java.
Primero al igual que en Java, el método principal de la clase principal deben llamarse igual, pero a diferencia de Java la aplicación Android debe heredar de Activity y no de JFrame.
Ciclo de vida de una actividad, sacado de
http://developer.android.com/reference/android/app/Activity.html
La
clase Activity, es una clase enfocada a lo que el usuario puede
hacer, casi todas las actividades interactuan con el usuario, es por
esto que la clase Activity crea un interfaz donde se puede colocar la
UI desarrollada a través de setContentView(View). La clase Activity
posee siete métodos que determinan las acciones de la actividad
dependiendo de la situación.
onCreate(Bundle) : Es llamada cuando la actividad es recién creada, es donde se inicializa la actividad, y donde se llama a setContentView(View) con el layout definida por tu UI, ademas con findViewById(int) se identifican los widgets en la UI con los cuales se quiere interactuar.
onStart() : Es llamada cuando la actividad es visible al usuario, luego de onCreate() o onRestart() en caso de si la actividad fue detenida.
onResume() : Es llamada cuando la actividad va a interactuar con el usuario, después de onStart() o onPause().
onPause() : Llamada cuando la actividad va a reanudar una actividad previa, tipicamente es para detener animaciones y otras cosas que consuman CPU. Esta implementación debe ser muy rápida ya que la siguiente actividad no empezara hasta que el método entregue alguna salida.
onStop() : Llamada cuando la actividad ya no es visible por el usuario, porque otra actividad a sido llamada y esta cubriendo esta.
onDestroy() : Esta es la ultima llamada antes de que la actividad sea destruida, este metodo sucede cuando alguien llama a finish() o porque el sistema esta destruyendo temporalmente esta instancia de la actividad para ahorrar espacio.
Es
por esto que los métodos onCreate() y onPause() estarán presentes
en casi todas las subclases de Activity.
La
modificación de estos métodos no es obligatoría
4 Recursos de sistemas sobre plataforma Android:
Como
se ha visto en el transcurso de la asignatura, existen diversos
recursos de sistema que se ponen a disposición del programador para
ayudar en el desarrollo de soluciones a problemas y android no es la
excepción. A continuación mostramos algunos de estos recursos que
fueron utilizados para este proyecto.
4.1
Procesos:
Una
aplicación android se ejecuta en su propio proceso de linux por lo
que la creación de otro proceso mediante un fork no es posible
dentro de la misma. Para el manejo de distintas operaciones se
generan hebras las cuales manejas los distintos planos de trabajo,
por ejemplo interfaz gráfica, procesamiento de datos, etc.
4.2
AsyncTask:
Esta
clase permite el manejo de tareas asíncronas de manera sencilla,
principalmente la ejecución de operaciones en segundo plano y
definir los resultados en el thread
de interfaz de usuario
sin
tener que complicarse manipulando threads
y
handlers.
4.2.1
Tipos genericos
AsyncTask
utiliza
tipos genéricos, por lo que resulta necesario definir tres tipos de
datos cada vez que necesitemos crear una instancia de esta clase:
Parámetros (Params). El tipo de información que se necesita para procesar la tarea.
Progreso (Progress). El tipo de información que se pasa dentro de la tarea para indicar su progreso.
Resultado (Result). El tipo de información que se pasa cuando la tarea ha sido completada.
4.2.2
Etapas del AsyncTask
Cada
vez que una tarea asíncrona se ejecuta, se pasa a través de 4
etapas:
onPreExceute(). Se invoca en el UI thread inmediatamente después de que la tarea es ejecutada. Este paso se utiliza normalmente para configurar la tarea. El ejemplo básico es cuando se muestra una ProgressBar en la interfaz de usuario.
doInBackground(Params…). Se invoca en el subproceso en segundo plano inmediatamente después de que onPreExecute() termina de ejecutarse. Dentro de esta etapa podemos utilizar el método publishProgress(Progress…) para publicar una o más unidades de progreso en el UI thread por la ayuda de la siguiente etapa que es onProgressUpdate(Progress…).
onProgressUpdate(Progress…). Se invoca en el UI thread después de una llamada a publishProgress(Progress…). El momento de la ejecución es indefinido. Este método es utilizado para mostrar cualquier tipo de progreso en la interfaz de usuario mientras la tarea en segundo plano sigue ejecutándose.
onPostExecute(Result…). Se invoca en el UI thread después de que el proceso en segundo plano ha sido terminado. El resultado devuelto por todo el proceso se pasa a este método como parámetro.
4.2.3 Para utilizar AsyncTask
Algunas consideraciones y reglas que debes seguir para utilizar AsyncTask:
Crear una subclase de AsyncTask, comúnmente como una clase interna privada dentro de la actividad en la que estemos trabajando.
Sobreescribir uno o más métodos de AsyncTask para poder realizar el trabajo en segundo plano, además de cualquier otra tarea asociada para poder mostrar alguna actualización en el UI thread.
Cuando sea necesario, crear una instancia de AsyncTask y llamar al método execute() para que empiece a realizar su trabajo.
La instancia de la tarea debe crearse en el UI thread.
El método execute(Params…) debe invocarse en el UI thread.
Los métodos onPreExecute(), onPostExecute(Result), doInBackground(Params…), on ProgressUpdate(Progress…) no deben llamarse de forma manual.
La tarea debe ser ejecutada sólo una vez (con excepción de que la ejecución corresponda a un segundo intento).
Aplicaciones:
A modo de demostración, se implementa la tarea “Recuento en Votaciones Electrónicas Sincrónicas” http://profesores.elo.utfsm.cl/~agv/elo330/2s11/Assignments/T3.html con el objetivo de mostrar estos recursos en dispositivos Android. Para ello se utilizaron tres celulares con este sistema operativo: el primero con la aplicación “Servidor Acumulador”, encargado de recibir y almacenar las votaciones, así como también de entregar las estadísticas de las mismas; en el segundo celular se instala el “Cliente Televisor” que se encarga de enviar las votaciones, las cuales van de 0 a 5; y el último, posee el “Cliente Monitor” que se conecta con el “Servidor Acumulador” para solicitar las estadísticas de las votaciones acumuladas y luego las despliega por pantalla.
Este trabajo fue desarrollado con el IDE Eclipse, por lo cual, cada una de las aplicaciones antes mencionadas contiene la carpeta con el correspondiente proyecto que debe ser importado al programa.
Anexo:
A continuación algunas páginas de interés para realizar desarrollo en dispositivos Android.
- Para probar las aplicaciones hechas en un dispositivo Android.
1.- Primero se debe declarar la aplicación como “debuggable” o “depuración”.
2.- Debe habilitarse la opción “Depuración de USB” en el dispositivo.
3.- Agregar el dispositivo al sistema operativo para poder ser detectado.
http://developer.android.com/guide/developing/device.html