¿Te perdiste la PRIMERA PARTE? Puedes encontrarla aquí
PARTE SEGUNDA: La aplicación

Capítulo 1 – Introducción

Saludos nuevamente chic@s.

Han leído bien, ya tocaba que hablara de como mas o menos esta desarrollada la aplicación de El Androide Libre. Ya que no solo es un widget que ponemos en el escritorio,sino que además clickarlo se muestra una ventana con el listado y demás opciones, esa seria la aplicación.

Así que para no perder la costumbre , os comentaré mas o menos sobre las aplicaciones en Android.

Así que , por si no lo saben, las aplicaciones Android, en su mayoría están escritas en el lenguaje de programación Java (buena elección) y distribuidas en un paquete con extensión .apk una ves todo ese código Java este compilado y transformado :)

No es MIDP, sino que usan su propio sistema modificado para obtener un mejor rendimiento , tema por el cual y entre otros Oracle le metio la demanda xDDDD

Debo resaltar también que cada aplicación Android es un mundo, es decir , estan aisladas unas de otras ya que por defecto cada aplicación Android tiene/corre su propio proceso y así de esta manera se asegura que cada proceso/aplicación tiene además su propia maquina virtual necesaria para ejecutar la aplicación Android escrita en código Java. Con esto se consigue que el código ejecutada este “completamente” aislado de las demás aplicaciones evitando así problemas de seguridad por accesos no deseados :p

Por si fuera poco lo anteriormente mencionado, como sabemos el núcleo de Android es el Linux, por tanto no fue nada descabellado usar como extras las potencia del mismo relacionado con todo el tema de permisos sistema de archivos y demás.

A donde quiero llegar ? Pues que cada aplicación en Android tiene asignado un único id de usuario, de modo que todos los archivos y demás de esa aplicación son solo visibles para ese usuario único y esa aplicación , lo que nos “garantiza” mayor seguridad evitando que otras aplicaciones puedan acceder a los datos de las demás.

Aunque existen maneras para poder compartir datos entre aplicaciones incluso que compartan el mismo id de usuario y el mismo proceso de esta manera se puede ahorrar en recursos ya que no se duplicarían ;)

También comentar que en Android las aplicaciones ni se crean ni se destruyen , sino que se pausan y se resumen, incluso si cambiamos la orientación pasa lo mismo se vuelve a “destruir” todo para pintarse nuevamente, situación que a mas de uno llega a joder a veces xDDDD

Aunque todo esto y mas lo pueden leer aquí http://developer.android.com/guide/topics/fundamentals.html

Donde verán además que uno de los elementos de las aplicaciones son los Activities o traducido al vulgar : las típicas ventanas de toda la vida xDDDD

Capítulo 2 – Desarrollo

(ya me enrolle de nuevo :s )

Ahora después de enrollarme un poco vamos a la aplicación xDDD

Para no variar y como han podido ver en todas mis aplicaciones trato de hacer las cosas simples, muy simples, y eso de alguna manera lo llevo al código también xDDD

Alguno me llamaría  vago ¬¬

Esta aplicación consta de tres elementos principales:

– El Activity

– La clase de petición y transformación del Rss de El Androide Libre

– El Adaptador de datos para pintar el listado de los artículos que aparecen en el Rss y un wrapper para el mismo para un mejor rendimiento.

Estos son los elementos principales de la aplicación, a que es simple ? xDD

Aunque hay mas cosillas , como son los layouts (la manera en que se verán las cosas en las ventanas) así como las imágenes usadas, los fondos y estilos y esas cositas que iremos mencionando de alguna manera a la largo del articulo. Aquí os dejo una primera imagen con la organización del proyecto , la típica a todos :)

Vemos:

  • El Androide Libre Widget = nombre del proyecto ,el [trunk] significa que esta en un control de versiones el proyecto bajo la carpeta trunk
  • src  = allí dentro esta todo el código de la aplicación Android
  • gen = esta es una carpeta que se genera automáticamente para todos los componentes de la aplicación asignándole a cada uno un identificador numérico único , este valor no se debería usar , de hecho esta carpeta ni le hagan caso xDDD uds trabajarían siempre con los identificadores literales que uds asignen según elección , comento esto porque hay personas que en lugar de usar los nombres usaba los identificadores numéricos y como esa carpeta se genera sola podían cambiar estos números y las aplicaciones fallaban porque esperaba un numero y recibía otro terminando siempre en problemas
  • android 1.6 = versión de las librerías base de android que se usaran en el proyecto
  • assests = aquí suelen meterse archivos binarios y demás cosillas que puedan ser necesarios para la aplicación pero que no necesariamente son parte de los recursos, ojo lo que almacenemos allí dentro no se le generara un identificador único, por lo que lo que haya allí dentro se tiene que cargar manualmente
  • img = esta es una carpetita mía, usualmente allí están los originales de todas las imágenes que uso en el proyecto y las que no uso también , suele ser el laboratorio almacén de todo incluyendo las imágenes vectoriales de los iconos que use
  • libs = otra de las mías; allí almaceno las liberáis de terceros que uso en la aplicación, las pongo allí ya que tengo varios proyectos y no siempre los tengo todos en el ordenador y así cuando los descargo tener las liberáis necesarias allí dentro, realmente es un problema porque tengo mas de 30 proyectos y en cada uno la carpeta lib con librerías repetidas lo que significa espacio en el servidor de versiones ocupado innecesariamente.
  • res = esta es del proyecto android , allí dentro esta todo lo que tiene que ver con el aspecto visual de la aplicación por decirlo de alguna manera, están los xml que definen las ventanas, las imágenes que se usaran en la aplicación , los estilos , los archivos de idiomas entre otras cosillas
  • to sign = esta es de las mías, allí dentro almaceno dos cosa 1) el archivo de firmas para la aplicación 2) la versión firmada y lista para subir al market de la aplicación, ya que al market solo se pueden subir aplicaciones firmadas y con un numero de versión superior a la publicada ;) por eso verane en mis aplicaciones 1.0.1.1 , 1.0.1.2..34 ya que aunque el cambio sea solo corregir un error siempre tendré que subir una versión superior xDDD algo que para no liarme uso un patrón simple para las versiones de la aplicación ,ya que hay una versión “publica” y la interna, la publica es la que leen normalmente en el market y la interna no se ve, no tienen que sea iguales, pero yo hago lo siguiente:
    • version publica: 1.0.1.1
    • version interna: 1011  (tiene que ser un numero entero :(  )

Bueno ya que os he comentado mas o menos como esta organizada la aplicación y si aun siguen despiertos , prosigamos con la explicación xDDDD ¬¬

Como en el articulo anterior ,volvemos al AndroidManifest.xml , este archivo es DIOS para la aplicación Android xDDD ¬¬ , lo que no salga aquí, no existe.

Es decir , podemos tener la aplicación con un código cojonudos y todas las demás virguerías, pero dentro del manifest es donde le decimos que nos creer un acceso directo en el escritorio , donde le decimos que salga en el menú de aplicaciones, o que salga en el listado de aplicaciones cuando se va a compartir algo, así como los permisos de la aplicación , visibilidad de las ventanas y la manera de comportarse de estas , gestionar el tema , y muchas mas cosillas.

Aquí os dejo una chapuzilla marcando mas o menos las partes del manifest :

Otra imagen , mostrando los elementos que intervienen en la Aplicación :
Estos funcionarían de la siguiente manera:Primero, la aplicación se abre y crear la ventana usando la clase Windows.java cuando se crea la instancia de este objeto entonces se consulta el Rss de El Androide Libre y con el resultado se genera una lista de objetos, estas lista serán los artículos, los cuales saldrán en la aplicaciones y de los cuales podremos leer el nombre del articulo así como una breve descripción, artículos que podremos clickar si queremos leer mas del mismo y esto lanzara una acción abriendo la url del articulo diciéndolo al sistema : “quiero ver esta url, por favor ejecuta la aplicación que sea capas de mostrármela”

Ese seria el funcionamiento de la aplicación, ahora vayamos por partes:

El usuario clicka nuestra aplicación en el listado principal y el android dice: “oye tu , te llaman”

La aplicación atiende la petición y allí dentro al abrirse hay un método que se llama onCreate que es el que se llama cuando se crea la ventana. En esta ocasión como les comente se mostrarían los artículos disponibles en el Rss del El Androide Libre , y específicamente el código que hace esta al abrirse la aplicación es el siguiente:

Algo sencillo como podrán ver, creamos una ventana de progreso de la acción para que así los impacientes no reviente la aplicación haciendo click :p

final ProgressDialog progress = ProgressDialog.show(this,

«Cargando….», «Descargando info de los artículos», true,

false);

Después creamos un hilo para que realice la tarea, pero porque un hilo ? pues de esta manera si hacemos mas cosas al abrir la aplicación puede esta acción se ejecutara y las demás podrán continuar , si no usáramos hilos , solo se ejecutaría una cosa detrás de otra.

Thread programacionThread = new Thread() {

Dentro del método run() del hilo entonces pedimos los artículos del Rss de El Androide Libre

items = Rss.getItems();

Hasta aquí sin problemas.

Ejecutamos la aplicación, esta pide los artículos y una ves los tenga los mostrara , y usara un hilo para que la aplicación no se quede tonta y otras acciones del inicio se ejecuten en “paralelo”

Ahora viene la parte interesante, normalmente cuando ejecutamos algo dentro de un hilo no nos deja modificar elementos de la ventana directamente por temas de seguridad y demás , por lo que si dentro del hilo intentáramos directamente pintar los artículos en la lista nos petaría por lo que antes comentaba , para evitar , diremos que X acciones las queremos ejecutar en le hilo de la ventana y así podremos entonces acceder directamente a los elementos de la ventana y modificarlos a nuestro antojo. Esto lo hacemos con :

runOnUiThread(new Runnable() {

El nombre lo dice todo , desgraciadamente , hay muchos programadores que no lo saben y tienen que montarse muchas virguerías :(

dentro del hilo principal ejecutamos :

setupItemsListView(); –> esto nos preparara el listado de articulos

progress.cancel(); –> deja de mostrar la ventana de progreso

como pintamos esa lista ? pues de esta manera :

El primer bloque marcado no necesita mucha explicación , se le pasa una dirección web y ese la mostrara con al navegador que tengamos en el sistema, el código de la funciona es el siguiente:

private void showLink(String url) {

Intent defineIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));

startActivity(defineIntent);

}

El segundo bloque de código lleva mas curro, ya que no usaremos una lista simple , sino una lista con vistas personalizadas, con varios elementos, para esto necesitaremos crearnos nuestro adaptador de datos , al cual al pasarle una lista de artículos nos vaya creando los elementos de la lista.

Aquí además usaremos en wrapper (ni idea de como decirlo en español) , esto lo que hará es que nuestra lista vaya mas rápido y consuma menos recursos en general :p

El contenido de este adaptador de datos personalizado esta en la clase ItemsAdapter.java

Esto seria la aplicación , realmente no tiene complejidad , lo mas jodido , al menos para mi , es encontrar la combinación del estilo adecuada, vamos el aspecto visual , en eso me meto horas hasta dar con algo que no me moleste xDDDDY si , aun no hemos visto como consultamos el Rss de El Androide Libre y devolvemos la lista

recuerdan el items = Rss.getItems();  pues veamos que tiene la función getItems() dentro :p

Abrimos el archivo Rss.java y cotilleamos el interior.

CAPITULO 3: FIN

Ya esta , misterio resuelto, este es el contenido de la aplicación de El Androide Libre, que por cierto esta publicada en el Market y actualmente tiene mas de 10 000 descargas únicas, GRACIAS A TODOS POR USARLA!!!!

P.D: Podéis conseguir este artículo al completo en Google Docs, (en este link)