Está en la página 1de 36

Loaders

Estos fueron introducidos en Android 3.0 (Honeycomb).



Hacen ms fcil el cargar datos de forma asncrona en una
actividad o en un fragmento.

Tienen estas caractersticas:

* Estn disponibles para cualquier Actividad y Fragmento.
* Proveen una forma asncrona para la carga de datos.
* Monitorean la fuente de datos y entregan nuevos resultados
cuando el contenido cambia.
* Se conectan de nuevo automticamente al ltimo cursos de
carga cuando son nuevamente creados despus de un cambio
de configuracin. As que no necesitan re-consultar sus datos.

Google no solamente introdujo los Loaders con Honeycomb
sino que tambin volvi obsoletas las formas antiguas para
manejar cursores dentro de las actividades. Por lo que no se
debera usar startManagingCursor() omanagedQuery() nunca
ms.




Las clases e interfaces de arriba son los componentes
esenciales para implementar un Loader en la aplicacin. No es
necesario tenerlas a todas en cada Loader que se cree.

Iniciando un Loader

Un LoaderManager administra uno o ms instancias
de Loader dentro de una Actividad o Fragmento. Slo hay un
LoaderManager por actividad o fragmento.

Un Loader se inicializa dentro del mtodo onCreate() de una
Actividad, o dentro del mtodo onActivityCreated() de un
Fragmento. Se hace as:

getLoaderManager().initLoader(ID, null, this);

Los parmetros que toma el mtodo initLoader() son los
siguientes:

* Un identificador nico para el loader.
* Argumentos opcionales para suministrar al loader en la
construccin.
* Una implementacin de LoaderManager.LoaderCallbacks.

Reiniciando un Loader

A veces quieres descartar los datos que cargaste inicialmente
y cargar unos nuevos. Para hacer esto, Android provee el
mtodo restartLoader().

Este mtodo toma los mismos parmetros del primer mtodo,
o sea de initLoader().

Nota: Recuerdas el identificador nico que pusiste al crear el
initLoader()? Bueno, ese es el que debes usar aqu como
parmetro para reiniciarlo.

getLoaderManager().restartLoader(ID, null, this);


Autora: David Snchez

Agradecemos a David por la excelente investigacin y
creacin de la lectura. Aportada desde el sistema de
discusiones del curso.




Bases de datos
Por: Aurora Rodrguez @condesa_sama

El sistema Android utiliza bases de datos para almacenar
informacin til que requiera ser persistida an despus de
que la aplicacin haya sido matada por el sistema o incluso
cuando el dispositivo haya sido reiniciado. Algunos ejemplos
de este tipo de informacin necesaria son los contactos,
ajustes del sistema, marcadores, etc.

Cuando se habla de este tema las preguntas ms recurrentes
son: para qu utilizamos las bases de datos en una
aplicacin mvil? Despus de todo, no resulta ms til
mantener nuestra informacin en la nube, dnde adems
puede ser respaldada en lugar de tenerla en el dispositivo
que es ms susceptible a que le pase algo? Una base de
datos en un dispositivo mvil es muy til como complemento
a un servicio web. Aunque en muchos casos es mucho mejor
contar con la informacin desde un servicio web, es til
almacenarla de forma local para poder acceder a ella de forma
ms rpida y tenerla disponible an cuando el dispositivo no
se encuentre conectado a una red. Cuando se utiliza con este
propsito se dice que una base de datos local est siendo
utilizada como un cach.

Acerca de SQLite

SQLite es una base de datos de cdigo abierto que tiene ya un
tiempo en el mercado, por lo que es bastante estable y ha
ganado popularidad en dispositivos pequeos, incluido
Android. Existen un par de buenas razones de por qu
SQLite es excelente para trabajarlo en el desarrollo de
aplicaciones con Android:

1. No necesitas ninguna configuracin manual de la base
de datos. Esto significa que como desarrollador no tendrs
que hacer algo en especial para empezar a utilizar una base de
datos con SQLite. Esto hace que sea realmente simple de usar.

2. No necesitas hacer uso de un servidor. No existe un
proceso especial que se encargue de correr SQLite sino que
usas un conjunto de libreras que proveen la funcionalidad de
una base de datos. No tener un servidor del cul preocuparte
es tambin algo bueno. Al final tienes un solo archivo de base
de datos. Esto hace que la seguridad de nuestra base de datos
sea ms sencilla pues delegamos esa tarea a la seguridad que
ya tiene el sistema de archivos de Android. Hasta este punto
ya sabes que Android asigna un sandbox especial y seguro a
cada una de las aplicaciones instaladas.Es open source.

El framework de Android ofrece varias formas fciles y
efectivas para utilizar SQLite. Veremos su uso bsico a lo
largo de este captulo. Aunque SQLite utiliza SQL, Android
provee una librera de alto nivel con una interface que
resulta ms fcil de integrar dentro de una aplicacin.

Nota: aunque el soporte de SQLite est construido dentro de
Android esto no significa que es la nica opcin para persistir
informacin en tu aplicacin. Siempre puedes utilizar otro
sistema de base de datos, como JavaDB o MongoDB, pero
tienes que tomar en cuenta que necesitars empaquetar las
libreras necesarias con tu aplicacin y tampoco podrs contar
con algn tipo de soporte por parte de Android para tu base de
datos. Recuerda tambin que SQLite no es una alternativa a
un servidor completo de SQL; en lugar de eso, debes verlo
como una alternativa para utilizar un archivo local con un
formato arbitrario.

DBHelper

Android provee una interface elegante para que tu aplicacin
interacte con bases de datos en SQLite. Para acceder a la
base de datos primero necesitas una clase ayudante que ser la
que provea una conexin a esa base de datos, crendola en
el caso de que an no exista. Esta clase la provee el
framework de Android y se llama SQLiteOpenHelper. La
clase de base de datos que regresa es una instancia de la clase
SQLiteDatabase.

En las siguientes secciones voy a explicar algunos de los
conceptos bases que debes entender cuando trabajas con
DBHelper. No voy a explicar nada de SQL o conceptos
bsicos de bases de datos como la normalizacin porque ya
existen cientos de lugares excelentes en los que puedes
encontrar informacin especfica de este tema y se espera que
como participante de este curso tengas claros estos conceptos.
No obstante esta introduccin te dar la informacin
suficiente para empezar, incluso si tu conocimiento en bases
de datos no es muy extenso.
El esquema de la base de datos y su
creacin

Un esquema es nicamente la descripcin de lo que habr
en una base de datos. Dependiendo del tipo de informacin
que necesites guardar en tu base de datos los campos de cada
una de las tablas variarn. Ahora necesitas un ID para poder
referirte fcilmente a cada uno de los registros que vas
guardando en cada tabla. SQLite, como la mayora de las
bases de datos, te permite declarar el ID como la llave
primaria e incluso asignar un nmero nico automticamente
para cada uno de los elementos de la base de datos.

Debes crear el esquema en el momento en el que la aplicacin
se inicia, por lo que debes hacer esta esta tarea dentro del
mtodo onCreate() de DBHelper. Agregars entonces nuevos
registros o modificars los existentes en una versin posterior
de tu aplicacin, por lo que asignars un nmero de versin a
tu esquema y proporcionars un mtodo onUpgrade() que
puedes mandar a llamar para modificar el esquema de la base
de datos.

onCreate() y onUpgrade() son los nicos mtodos en tu
aplicacin que necesitas para utilizar SQL. Ejecuta el
comando CREATE TABLE dentro del mtodo onCreate() para
crear una tabla en tu base de datos. En una aplicacin de
produccin, utilizaras el comando ALTER TABLE dentro del
mtodo onUpdgrade() cuando el esquema de tu base de datos
cambie, pero eso requiere mucho trabajo complejo de
introspeccin de la base de datos, por lo que por ahora,
bastar con que utilices el comando DROP TABLE y recrees
la tabla. Por supuesto DROP TABLE te elimina cualquier
informacin que est dentro de la tabla. Esta instruccin no
representa ningn problema si el uso de la base de datos
dentro de tu aplicacin cumple la funcin de ser nicamente
un cach.

Las cuatro operaciones principales

La clase DBHelper te ofrece una interface de alto nivel que es
mucho ms simple que utilizar SQL. Los desarrolladores han
observado que la mayora de las aplicaciones utilizan las
bases de datos nicamente para cuatro operaciones principales
que van con el atractivo acrnimo CRUD: Create, Read
(Query), Update y Delete. Para cumplir con estos
requerimientos DBHelper ofrece:

insert(). Inserta una o ms filas dentro de la base de datos.
query(). Solicita las filas que coincidan con el criterio que
especifiques.
update(). Reemplaza una o ms filas que coincidan con el
criterio que especifiques.
delete(). Elimina las filas que coincidan con el criterio que
especifiques.

Cada uno de estos mtodos tiene variantes que los mejoran
con otras funciones. Para usar cualquiera de estos mtodos es
necesario que crees un contenedor que representars con una
instancia de la clase ContentValues y ser aqu dnde pondrs
la informacin que quieras insertar, actualizar o borrar. En
este captulo te mostrar el proceso para insertar informacin;
el resto de las operaciones funcionan de manera muy similar.

Pero por qu no usar SQL directamente? Existen tres
buenas razones para que no lo hagas:
.
* Primero: desde un punto de vista de seguridad una
sentencia de SQL es la principal candidata para un ataque
de seguridad en tu aplicacin y en tu informacin,
conocido como ataque de inyeccin SQL. Esto es porque las
sentencias SQL utilizan la entrada del usuario y a menos
de que hagas una validacin y verificacin exhaustiva, esta
entrada puede embeber otras sentencias SQL con efectos no
deseados.

* Segundo: desde un punto de vista de rendimiento,
ejecutar sentencias SQL de forma repetida es altamente
ineficiente porque necesitaras parsear el SQL cada vez
que la sentencia se ejecuta.

* Tercero: los mtodos del DBHelper son ms robustos y
menos propensos a pasar sentencias sin que el compilador
detecte errores. Cuando incluyes SQL en un programa es
muy fcil crear errores que slo puedan ser identificados en
tiempo de ejecucin.

El framework de base de datos de Android slo soporta
sentencias preparadas para operaciones estndares de CRUD:
INSERT, UPDATE, DELETE y SELECT. Para otras
sentencias SQL pasars directamente la sentencia a SQLite.
Esta es la razn por la que utilizars el mtodo execSQL()
para correr el cdigo para el CREATE TABLE. Esto est bien
porque este comando no depende de ninguna entrada por
parte del usuario y por ello no es susceptible a alguna
inyeccin de SQL. Adicionalmente este tipo de sentencia se
ejecuta muy rara vez, por lo que no tendrs que
preocuparte de las implicaciones en el rendimiento de la
aplicacin.

Cursores

Una consulta regresa un conjunto de filas junto con un
apuntador llamado cursor. Puedes recuperar resultados uno
por uno de este cursor, haciendo que avances de fila en fila y
de vez en vez. Puedes mover este cursor a travs del set de
resultados. Un cursor vaco indica que ya has recorrido todas
las filas.

En general cualquier cosa que hagas con SQL puede lanzar
una SQLException porque este cdigo est interactuando con
un sistema que est fuera de tu control directo. Por ejemplo la
base de datos podra correr fuera del espacio disponible o algo
dentro de ella podra estar corrupto. Por lo tanto, es una buena
prctica que manejes todas las SQLExceptions dentro de
bloques try/catch.

Es fcil hacer esto si usas los atajos de Eclipse:

Selecciona el cdigo del cual quieres manejar
excepciones. Este cdigo ser en su mayora las
llamadas que hagas con SQL. En el men de Eclipse,
selecciona Source > Surround With > Try/catch
Block. Eclipse generar las sentencias apropiadas de
try/catch que rodearn a tu cdigo para la excepcin
correcta que pueden generar. Maneja esta excepcin
dentro del bloque catch. Puede ser una simple llamada a
Log.e() para pasar el tag, el mensaje y el objeto que
representa la excepcin.

Bloques principales de
construccin de aplicaciones
Android
Por: Aurora Rodrguez @condesa_sama

La intencin de este material es brindarte una visin general
de alto nivel acerca de lo que son las actividades, cmo
funcionan los intents, por qu los servicios son tan cool, y
cmo utilizar los broadcast receivers y content providers para
hacer tu aplicacin escalable y mucho ms.

Conocer los componentes principales de Android para
construir aplicaciones es algo vital para entender que
entiendas el funcionamiento de la plataforma. Es importante
que sepas de forma conceptual cundo utilizar cada
componente. As mismo te ensearemos cmo estos
componentes se relacionan con una aplicacin del mundo
real.



Qu son los bloques principales de construccin?

Los bloques principales de construccin son componentes que
utilizas como desarrollador de aplicaciones para construir
aplicaciones Android. Son componentes conceptuales que
combinas para crear un todo. Cuando comienzas a pensar en
tu aplicacin, es bueno tomar un enfoque de arriba hacia
abajo. Regularmente diseas una aplicacin en trminos de
pantallas, caractersticas y la interaccin entre estos dos
elementos. Con esto comienzas con un dibujo conceptual,
algo que puedes representar en trminos de lneas y
crculos. Este enfoque para desarrollar aplicaciones te ayuda
a ver el panorama completo, es decir, la forma en que los
componentes encajan juntos y cmo todo toma sentido.

Un ejemplo de la vida real

Supongamos que tu inters es construir una aplicacin cliente
para Twitter. Sabes que el usuario debe poder postear
actualizaciones de estado. Sabes tambin que el usuario debe
poder ver lo que sus amigos estn posteando. Estas son las
caractersticas bsicas. Adicionalmente, deberas poder
proporcionarle al usuario el mecanismo para poderse
autenticar con su cuenta de Twitter. Por lo tanto, ahora sabes
que tu aplicacin debera tener por lo menos estas tres
pantallas.

Ahora, te gustara que esta aplicacin trabaje rpidamente sin
tener en cuenta el estado de conexin a la red. Para hacer
frente a esto la aplicacin deber contar con un mecanismo
que le permita guardar informacin de Twitter cuando el
dispositivo no se encuentre conectado a alguna red y pueda
almacenar esta informacin localmente. Para lograr esto
necesitars un servicio que se ejecute en segundo plano al
igual que la base de datos.
Otra cosa que te gustara incluir en la aplicacin es que este
servicio en segundo plano se inicie cada vez que el dispositivo
se encienda, para que cuando el usuario utilice tu aplicacin
por primera vez, esta pueda mostrar informacin actualizada
de sus amigos.

Bien, con esto ya tienes un panorama ms claro de los
requerimientos de tu aplicacin. Los bloques principales de
construccin de Android te ayudarn a convertir estos
requerimientos en unidades conceptuales con los que puedas
trabajar de forma independiente y relacionarlos dentro de un
paquete completo.

Actividades

Una actividad es en general una sola pantalla que el usuario
ve en el dispositivo, una por vez. Tpicamente una aplicacin
est formada por mltiples actividades y el usuario navega de
forma secuencial (hacia delante o hacia atrs) a travs de
ellas. Como tal, las actividades son la parte ms visible de una
aplicacin.

Generalmente utilizo un sitio web como la analoga de las
actividades. Justo como en un sitio web que consiste en
mltiples pginas, una aplicacin Android consiste en
mltiples actividades. Justo como un sitio web que tiene una
home page una aplicacin Android tiene una actividad
principal (main activity), que generalmente es la que se
muestra primero cuando la aplicacin se ejecuta. Y justo
como los sitios web deben proveer algn tipo de navegacin
entre las diferentes pginas que lo conforman, una aplicacin
Android debe hacer lo mismo.

Tambin, as como es posible en la Web saltar de una pgina
que pertenece a un sitio a otra pgina que pertenece a otro
sitio web, en Android es posible estar viendo la actividad de
una aplicacin y desde ah iniciar otra actividad que
pertenezca a una aplicacin diferente. Por ejemplo, si te
encuentras en tu aplicacin de Contactos y eliges la opcin de
escribir un mensaje de texto a uno de tus amigos, estars
lanzando la actividad para escribir un mensaje que forma
parte de la aplicacin de Mensajes.

Ciclo de vida de las actividades

Lanzar una actividad puede ser en ocasiones un proceso caro
para el sistema. Esto involucra crear un nuevo proceso de
Linux, reservar memoria para todos los objetos de la UI, inflar
todos los objetos de los archivos XML de layout, y crear toda
la pantalla que se mostrar en el dispositivo. Como ests
haciendo mucho trabajo para lanzar una actividad, sera un
desperdicio tirar todo esto cada vez que el usuario dejara esa
pantalla. Para evitar eso, el ciclo de vida es manejado por el
Activity Manager.

El Activity Manager es el responsable de crear, destruir y
administrar las actividades. Por ejemplo, cuando un usuario
inicia una aplicacin por primera vez, el Activity Manager
mover la actividad previa a un lugar de espera. De esta
forma, si el usuario quiere regresar a una actividad previa,
esta puede ser iniciada rpidamente. Las actividades ms
antiguas que el usuario no ha usado durante un largo perodo
de tiempo sern destruidas con el objetivo de liberar espacio y
recursos para que la actividad actual pueda hacer uso de ellos.
Este mecanismo est diseado para ayudar a mejorar la
velocidad de la interfaz de usuario y mejorar la experiencia de
usuario en su totalidad.

Programar en Android es conceptualmente diferente que
programar en algn otro ambiente. En Android regularmente
estars respondiendo ms a ciertos cambios en el estado de la
aplicacin en lugar de inducir los cambios manualmente
dentro de nuestra aplicacin. Se trata de un ambiente basado
en callbacks. Por ello, cuando la aplicacin pasa por algn
estado del ciclo de vida de las actividades, puedes tener la
oportunidad de definir qu pasa durante la transicin de un
estado a otro. El siguiente esquema muestra los diferentes
estados por los que puede pasar una actividad:




Imagen:
http://developer.android.com/images/training/basics/basic-
lifecycle.png

Created State

Cuando una actividad no existe en memoria se dice que pasa
por el estado de inicio. Mientras se est iniciando, la actividad
pasar por un conjunto de mtodos de callback que t como
desarrollador tienes la posibilidad de manipular. Es en este
estado en el que se construye la UI que se mostrar en la
Activity y en dnde adems se inicializan los objetos que va a
utilizar para poder ejecutar la funcionalidad especfica.

Ten en cuenta que esta transicin del Created State al
Resumed State es uno de las operaciones ms caras en
trminos de tiempo de cmputo, y esto tambin afecta
directamente a la vida de la batera del dispositivo. Esta es la
razn de por qu no se destruyen las actividades que ya no se
estn mostrando automticamente. Es probable que el usuario
quiera regresar a alguna de ellas, por lo que las mantendremos
vivas por un perodo de tiempo.

Resumed State

Una actividad que se encuentra en el Resumed State es aquella
que se encuentra en la pantalla y con la que el usuario est
interactuando. Tambin decimos que esta actividad tiene el
foco, lo que quiere decir que todas las interacciones del
usuario, tales como tocar la pantalla, presionar los controles o
escribir, son manejadas por esta actividad. Por tal razn,
siempre habr una sola actividad que se muestre a la vez.

La actividad que se est corriendo es aquella que tiene
prioridad en trminos de obtener memoria y recursos que
necesite para correr lo ms rpido que sea posible. Esto est
diseado as porque Android quiere asegurarse de que la
actividad que est corriendo sea responsiva.

Paused state

Cuando una actividad no tiene el foco (es decir, que no est
interactuando con el usuario) pero an est visible en la
pantalla, decimos que se encuentra en el estado pausado. Este
no es un escenario tpico, porque regularmente la pantalla es
pequea, y una actividad ocupa la pantalla completa o
ninguna. Regularmente veremos este escenario cuando los
cuadros de dilogo se muestran sobre una actividad,
provocando que esta sea pausada. Todas las actividades pasan
por el estado pausado en camino para ser detenidas. Las
actividades pausadas siguen teniendo prioridad alta en
trminos de obtener memoria y otros recursos. Esto es porque
son visibles y no podran ser removidas de la pantalla sin que
eso se viera un poco extrao para el usuario.

Stopped state

Cuando una actividad no es visible, pero an se encuentra en
memoria, es cuando decimos que se encuentra en el estado
detenido. Una actividad detenida puede recuperarse para
mostrarse en pantalla y entrar en el Resumed State
nuevamente. O, tambin cabe la posibilidad de que sea
destruida y removida de la memoria.

El sistema mantiene las actividades en memoria cuando son
detenidas porque cabe la posibilidad de que el usuario quiera
regresar a ellas en algn momento, y reiniciar una actividad
detenida es un proceso ms barato (en trminos de uso de
memoria) que iniciar una actividad desde cero. Esto se debe a
que en el momento en el que una actividad se detiene todos
los objetos ya estn cargados en memoria y simplemente se
requiere tomarlos y mostrarlos en primer plano.Hay que
tomar en cuenta, adems, que las actividades detenidas
pueden ser removidas de la memoria en cualquier momento.

Destroyed state

Una actividad destruida no est ms en memoria. El Activity
Manager ha decidido que esta actividad ya no es necesaria y
la ha removido. Antes de que la actividad sea destruida, es
posible ejecutar ciertas acciones, tal como guardar aquella
informacin que an no ha sido guardada. Sin embargo, no
existe garanta de que una actividad sea detenida antes de ser
destruida. Es posible que una actividad pausada sea destruida.
Por esa razn, es importante ejecutar las acciones importantes,
como guardar la informacin, a partir del estado pausado en
lugar de esperarse hasta el ltimo estado.

Nota: el hecho de que una actividad est en el Resumed State
no quiere decir que est realizando muchas cosas. Puede ser
que nicamente se est mostrando y esperando a que el
usuario introduzca algn tipo de entrada o interacte con
algn elemento de la UI. De manera similar, una actividad
detenida no necesariamente significa que no est haciendo
algo. Los nombres de los estados nicamente hacen referencia
a qu tan activa est una actividad con respecto a la entrada de
datos del usuario, en otras palabras, si la actividad est
visible, tiene el foco y ya no est visible.

Intents

Los Intents son mensajes que son mandados entre los
principales bloques de construccin. Ellos son los encargados
de lanzar una actividad para que se inicie, le dicen a un
servicio cuando iniciar o detenerse, o toman el papel del
formato de los mensajes entre el sistema de Broadcast
Receivers de Android. Los Intents son asncronos, lo que
significa que el cdigo que los lanza no tiene que esperar a
que estos completen su trabajo.

Un Intent adems, puede ser explcito o implcito. En un
intent explcito el emisor define claramente qu componente
especfico debe ser el receptor final. En un Intent implcito el
emisor nicamente define el tipo que deber tener el receptor.
Por ejemplo, una actividad puede mandar un Intent diciendo
que simplemente necesita a alguien que pueda abrir una
pgina web. En este caso, cualquier aplicacin que sea capaz
de abrir una pgina web puede competir para completar esta
accin.

Cuando hay ms de una aplicacin que pueda ejecutar una
tarea, el sistema le pregunta al usuario con cul de las
aplicaciones disponibles prefiere completar tal accin. Es
posible tambin definir una aplicacin como la default para
responder a cierta accin. Este mecanismo funciona de
manera muy similar a tu entorno de escritorio, por ejemplo,
cuando descargas Firefox o Google Chrome para reemplazar
el navegador por default, ya sea Internet Explorer o Safari.

Este mensaje les permite a los usuarios reemplazar cualquier
aplicacin del sistema con una personalizada. Por ejemplo,
podras descargar una aplicacin de SMS o un navegador que
reemplacen a los que el sistema trae por default. La siguiente
imagen muestra la manera en la que los Intents son usados
para saltar entre varias actividades, ya sea dentro de una
misma aplicacin o incluso de otras aplicaciones.

A continuacin se muestra un esquema de un flujo entre
aplicaciones utilizando los Intents:



El usuario consulta la Actividad que muestra la bandeja de
entrada de su correo.El usuario ve el detalle de un mail que
contiene una URL. Al dar clic sobre la URL se dispara un
Intent para elegir la app que me mostrar el contenido.El
usuario elige Google Chrome. En el contenido de la URL est
un post que contiene otro URL pero esta vez del servicio de
Youtube.Se lanza un segundo Intent para elegir si abrir ese
contenido con el navegador actual o con la aplicacin de
YouTube instalada en el dispositivo.

Servicios

Los servicios se ejecutan en segundo plano y no poseen
ningn componente de interfaz de usuario. Los servicios
pueden realizar las mismas acciones que las actividades, pero
sin una interfaz de usuario. Los servicios son tiles para
acciones que queremos realizar durante un perodo de tiempo
independientemente de lo que se est mostrando en la
pantalla. Por ejemplo, es comn que un usuario prefiera
escuchar msica an cuando se encuentre trabajando en otras
aplicaciones.

Nota: es importante no confundir los servicios Android que
son parte de una aplicacin con los servicios nativos de
Linux, servidores o demonios, que son componentes de ms
bajo nivel del sistema operativo.

Los servicios tienen un ciclo de vida ms simple que el de las
actividades. nicamente inicias o detienes un servicio. Otra
diferencia es que el ciclo de vida es ms o menos controlado
por el desarrollador y no tanto por el sistema. Por
consiguiente, como desarrolladores debemos idear la manera
de ejecutar nuestros servicios de modo que no consuman
recursos compartidos de forma innecesaria, tales como el
CPU o la batera.

A continuacin se muestra un esquema que ilustra el ciclo de
vida de un servicio.




El hecho de que un servicio se ejecute en segundo plano no
quiere decir que est corriendo en un hilo diferente. Si el
servicio est procesando algo que tome cierto tiempo para ser
completado (como por ejemplo realizar llamadas que utilicen
la red), es recomendable cuidar que el servicio corra en un
hilo diferente. De otro modo, la interfaz de usuario se tornar
lenta. En otras palabras, los servicios y actividades se ejecutan
en el mismo hilo principal de la aplicacin, tambin conocido
como el UI thread.




Content Providers

Los content providers son interfaces para compartir
informacin entre las aplicaciones. Por default Android
ejecuta cada aplicacin dentro de su propio sandbox por lo
que toda la informacin que pertenece a una aplicacin est
totalmente aislada de otras aplicaciones del sistema. Aunque
es posible pasar pequeas cantidades de informacin entre
aplicaciones usando los intents como medio, los content
providers son ms adecuados para compartir informacin
persistente entre posibles cantidades bastante grandes de
informacin. Como tal, la API de los content providers se
apega al principio CRUD. El siguiente esquema ilustra cmo
la interfaz CRUD de los content providers traspasa los lmites
de la aplicacin y permite que otras aplicaciones se conecten a
ella para compartir informacin.




El sistema Android usa este mecanismo todo el tiempo. Por
ejemplo Contacts Provider es un content provider que expone
toda la informacin de los contactos del usuario hacia varias
aplicaciones. Settings Provider expone las configuraciones
del sistema hacia varias aplicaciones, incluyendo la aplicacin
Settings que incorpora el sistema. Media Store es el
responsable de guardar y compartir los archivos multimedia,
como fotos y msica, a travs de varias aplicaciones. El
siguiente esquema ilustra cmo la aplicacin de contactos
utiliza el Contacts Provider, una aplicacin totalmente
separada, para recuperar la informacin de los contactos del
usuario. La aplicacin de contactos por s misma no cuenta
con informacin de ningn contacto y el Contacts Provider
no cuenta con ninguna interfaz de usuario.




Esta separacin del almacenamiento de la informacin y la
interfaz de usuario actual de la aplicacin ofrece una mayor
flexibilidad para mezclar varias partes del sistema. Por
ejemplo, un usuario puede instalar una aplicacin alternativa
de libreta de contactos que utilice la misma informacin de la
aplicacin por default de contactos. O, podra incluso instalar
un widget en el home que permita cambiar fcilmente las
configuraciones del sistema, como por ejemplo apagar o
encender el WiFi, Bluetooth o el GPS. Muchos fabricantes de
telfonos toman ventaja de los content providers para agregar
sus propias aplicaciones por encima de las que Android tiene
por default con el objetivo de mejorar la experiencia de
usuario, un ejemplo de esto es HTC Sense.

Los content providers son relativamente interfaces simples,
que poseen los mtodos estndar insert(), update(), delete() y
query(). Estos mtodos son muy similares a los mtodos
estndar de las bases de datos, por lo que resulta
relativamente fcil implementar un content provider como un
proxy para acceder a una base de datos. Dicho esto, resulta
ms probable utilizar los content providers existentes que caer
en la posibilidad de crear uno propio.

Broadcast Receivers

Los broadcast receivers son implementaciones del
mecanismo a nivel sistema de publish/subscribe o de forma
ms precisa, un patrn de observador (Observer Pattern). El
receptor es simplemente un cdigo latente que se activa cada
vez que un evento al cul est suscrito sucede.
El sistema por s mismo transmite eventos todo el tiempo. Por
ejemplo, cuando un SMS llega, cuando entra una llamada,
cuando la batera est baja o incluso cuando el sistema se
inicia. Todos estos eventos se transmiten y cualquier nmero
de receptores pueden ser lanzados por ellos.

Para nuestra aplicacin de ejemplo de Twitter queremos
iniciar el servicio de actualizacin una vez que el sistema
arranca. Para hacer esto, podemos suscribirnos al broadcast
que nos dice cuando el sistema ha completado su
arranque. Tambin podemos mandar nuestros propios
broadcasts desde una parte de nuestra aplicacin a otra e
incluso hacia una aplicacin totalmente diferente.

Los broadcast receivers por s mismos no tienen ninguna
representacin visual ni tampoco se encuentran corriendo de
forma activa en memoria. Pero cuando son lanzados, tienen
que ejecutar algn cdigo como iniciar una actividad, un
servicio o algo ms.

Application Context

Hasta ahora hemos visto lo que son las actividades, los
servicios, los content providers y los broadcast receivers.
Juntos pueden crear una aplicacin. Otra forma de decir esto
es que estos elementos viven en el mismo contexto de la
aplicacin.

El contexto de la aplicacin se refiere al entorno de la
aplicacin y los procesos con los cuales todos estos
componentes se estn ejecutando. Les permite a las
aplicaciones compartir informacin y recursos entre varios
bloques de la aplicacin. Un contexto de aplicacin se crea en
el momento en el que el primer componente de una aplicacin
se inicia, independientemente de qu componente se trate
(actividad, servicio u otro). El contexto de la aplicacin vive
tanto como viva la aplicacin. Por eso es independiente del
ciclo de vida de las actividades. Se puede obtener fcilmente
una referencia al contexto llamando a los mtodos
Context.getApplicationContext() o
Activity.getApplication(). Toma en cuenta que las
actividades y los servicios son actualmente subclases de la
clase Context y por ello heredan todos sus mtodos.



Hilos en Android

Por: Aurora Rodrguez @condesa_sama

Un hilo es una secuencia de instrucciones ejecutadas en
orden. Aunque cada CPU puede procesar solamente una
instruccin a la vez, la mayora de los sistemas operativos son
capaces de manejar multihilos en mltiples CPUs o
intercalarlos en un solo CPU. Diferentes hilos necesitan
diferentes prioridades, por lo tanto el sistema operativo
determina cunto tiempo darle a cada uno si tienen que
compartir CPU.

El sistema operativo Android est basado en Linux y como tal
tiene plena capacidad de ejecutar mltiples hilos al mismo
tiempo. Sin embargo necesitas estar consciente de la forma en
que las aplicaciones usan los hilos para poder disear tu
aplicacin apropiadamente.
Un slo hilo

Por default una aplicacin Android corre dentro de un solo
hilo. Las aplicaciones con un solo hilo ejecutan todos los
comandos en serie, lo que significa que un comando no se
ejecutar hasta que el comando previo lo haya hecho. Otra
forma de decir esto es que cada llamada es bloqueada.



Este nico hilo tambin se conoce como el UI Thread porque
es el que procesa tambin todos los comandos de la interfaz
de usuario. El UI Thread es responsable de dibujar todos los
elementos en la pantalla as como de procesar todos los
eventos del usuario, por ejemplo cuando toca la pantalla o
hace tap sobre un botn.

A partir de la actualizacin a Android 2.2 Froyo las
aplicaciones no pueden ejecutar instrucciones como
consulta a APIs REST (que involucran el uso de Internet)
en el UI Thread. La primera razn de este cambio en la
plataforma es que el tiempo que puede pasar para que el
servidor que ests consultando te responda es indefinido. La
segunda razn es que las llamadas de este tipo estn sujetas a
la disponibilidad de la red; por lo tanto, no podrs controlar si
al momento de que el usuario ejecute tu aplicacin su
dispositivo cuenta con una conexin WiFi muy veloz o si en
cambio, est utilizando un protocolo muy lento para
conectarse a la Internet. Si el peor de los escenarios se da, tu
aplicacin no puede responder, es decir, permanecer
bloqueada hasta que la llamada a la red se haya completado.





Importante: el sistema Android matar cualquier aplicacin
que no est respondiendo dentro de cierto perodo de tiempo,
usualmente alrededor de cinco segundos para las actividades.
Este error lo identificars cuando se lance el dilogo
Application Not Responding o ANR por sus siglas.
Multihilos

Una mejor solucin es que tengas aquellas operaciones que
son potencialmente largas corriendo en un hilo separado.
Cuando mltiples tareas corren en mltiples hilos al mismo
tiempo el sistema operativo divide el CPU disponible para
que ninguna tarea pueda dominar la ejecucin. Como
resultado mltiples tareas estn ejecutndose en paralelo al
mismo tiempo.

En este ejemplo puedes poner tu llamada a la red para
actualizar el estatus en la nube en un hilo separado. De esa
forma tu UI Thread no se bloquear mientras esperas a la red
y adems tu aplicacin se mostrar ms responsiva.
Tendemos a hablar de nuestro hilo principal como si se
ejecutara en primer plano y los dems hilos se ejecutaran en
segundo plano. Sin embargo todos estos son iguales en estatus
y alternan su ejecucin en el CPU del dispositivo, pero desde
el punto de vista del usuario el hilo principal est en primer
plano porque es quien se encarga de la UI. Hay muchas
maneras de implementar el multihilo en una aplicacin.

Java tiene una clase llamada Thread que te permite
ejecutar operaciones dentro del mtodo run() que tiene
definido. Esta opcin es vlida y puedes utilizarla
en tus aplicaciones Android. Sin embargo utilizarla es
problemtico porque otro hilo no tiene permitido actualizar
elementos en el UI Thread. Esto hace sentido porque para
actualizar el UI Thread necesitaras sincronizarte con el
estado actual de sus objetos y sera un trabajo muy
pesado. Por esta razn cuando una aplicacin requiera de
la ejecucin de una tarea en un hilo nuevo y adems el
resultado de ese cdigo sea importante para refrescar la
interfaz de usuario es recomendable que utilices la clase
AsyncTask del framework de Android, especialmente
diseada para este propsito.

AsyncTask es un mecanismo de Android creado para ayudar
a manejar operaciones largas que necesiten reportar algo al UI
Thread. Para que tomes ventaja de esta clase necesitas crear
una subclase de AsyncTask e implementar los mtodos
onPreExecute(), doInBackground(), onProgressUpdate() y
onPostExecute(). Con estos mtodos puedes definir qu
quieres que haga tu aplicacin antes de crear un hilo, qu
tarea quieres ejecutar dentro de ese nuevo hilo, qu hacer
mientras la tarea se est procesando y qu debes hacer
cuando la tarea se termine. Paraque puedas usar este elemento
en "mis aplicaciones" debes crear una clase que herede de
AsyncTask. Al momento de crear la subclase vers la
particularidad de que AsynTask define tres tipos genricos en
su firma.

Por ejemplo:

class MyTask extends AsyncTask<Void, Void, Void>{
}

Estos se conocen como Java Generics y se utilizan para
describir los tipos de datos que este AsyncTask puede utilizar
dentro de sus mtodos. El primer tipo de dato es usado por
doInBackground, el segundo por onProgressUpdate y el
tercero por onPostExecute.

- onPreExecute() es el mtodo de callback que se ejecuta
justo antes de que se cree el hilo dnde se procesar una tarea
que tomar un tiempo indefinido. Generalmente en este
mtodo se lanza un ProgressDialog para que el usuario pueda
ver que se inici el procesamiento de una tarea.

- doInBackground() es el mtodo de callback que especifica
el trabajo actual que debe realizarse dentro del hilo que se
ejecutar en segundo plano y que es independiente del UI
Thread. Cuando implementes este mtodo dentro de tu clase
vers que su firma es parecida a la siguiente:

@Overrideprotected void doInBackground(Object
param){
}

La razn de que el argumento que recibe este mtodo tenga
tres puntos es indicar que puedes recibir un arreglo de
objetos del tipo que se haya definido como el primer Java
Generic al momento de haber creado la subclase de
AsyncTask. Estos objetos los mandas cuando en la Activity
ejecutas la siguiente lnea de cdigo:

new MyTask().execute(myParams)

nicamente debes cuidar que sean del mismo tipo de dato
para evitar errores de compilacin.

- onProgressUpdate() es llamado en cualquier momento en
que la tarea est en ejecucin. El progreso de una tarea se
reporta haciendo una llamada al mtodo publishProgress()
dentro de doInBackground(). Generalmente implementas
este mtodo cuando buscas mostrarle al usuario un elemento
de tipo ProgressBar que le permita ver el avance de la tarea
que se est ejecutando en segundo plano. Si por ejemplo
tu aplicacin descargara archivos, este mtodo podra reportar
el porcentaje de cunta informacin est siendo descargada.
En caso de que tu aplicacin no requiera una funcionalidad
como la mencionada simplemente puedes no incluir este
mtodo dentro de tu subclase.

- onPostExecute() es llamado cuando tu tarea ha sido
completada. Este es tu mtodo de callback para actualizar la
interfaz de usuario y decirle al usuario que la tarea est
terminada. Puedes utilizarlo para ocultar un ProgressDialog
que hayas lanzado previamente en el onPreExecute(), o bien,
para lanzar un AlertDialog notificndole al usuario que
ocurri un error en la tarea que se estaba ejecutando.

Por ltimo, debes saber que puedes crear una subclase de
AsyncTask como una clase interna de una Activity o en una
clase completamente independiente, es decir, en un archivo
nuevo .java.

Cundo usar una u otra? La opcin de hacerla miembro de
una Activity se toma cuando el uso del AsyncTask ser
exclusivo para ese componente. En caso de que necesitemos
que un AsyncTask pueda ser llamado por ms elementos
podemos elegir convertirlo en una clase completamente
independiente.



La importancia del MVC en
Android


Ests inicindote en el desarrollo mvil y te preguntas: Por
dnde empiezo? Qu debo saber? Cmo debo
programar? Yo parto de una primera premisa: el desarrollo
mvil no es fcil pero tampoco es imposible. Lo ms
importante al comienzo, aparte de familiarizarte con las
herramientas y con los lenguajes que puedes utilizar dentro
del abnico de opciones disponibles, es estar al tanto de las
arquitecturas que te permitirn crear buenas aplicaciones, no
slo desde el enfoque de performance sino tambin desde un
enfoque tcnico. As que esta lectura se trata de la
arquitectura que se utiliza en el desarrollo mvil, su
importancia y por qu, si an no la conoces, debes considerar
seriamente empaparte de ella para cambiar tus prcticas de
programacin.

En Android se usa el patrn de arquitectura llamado Modelo
Vista Controlador (MVC) cuya principal bondad consiste en
separar los datos de una aplicacin, la interfaz de usuario y la
lgica de negocios en tres componentes distintos que se
relacionarn para al final tener como resultado nuestra
aplicacin. De esta forma puedes seccionar de forma ms fcil
tu equipo de trabajo y dedicarte a desarrollar sus componentes
de tal forma que construyas mdulos o libreras con
funcionalidades especficas, que incluso podras reutilizar en
proyectos posteriores y no simplemente en el proyecto actual.
Para lograr esto el diseo de la arquitectura de tu aplicacin
juega un papel importante, as como la capacidad de
abstraccin que tengas desarrollada.

Por ejemplo, yo me podra dedicar a desarrollar una librera
que me permita hacer conexiones con la API de Twitter. En
mis clases puedo disear todas las funciones que me ayudarn
a lograr las llamadas al protocolo OAuth, aquellas que me
permitan twittear, recuperar informacin de tweets, followers,
trending topics, etc. Esta librera, con un buen diseo y
abstraccin, podra ser til para todos los proyectos que
necesiten conectarse con Twitter.

Volvmonos un poco tericos y expliquemos de qu se tratan
los componentes de este modelo:



* Modelo: se entiende por modelo las representaciones que
construirs basadas en la informacin con la que operar
tu aplicacin. En Java el modelo viene siendo anlogo a los
beans que tienen la particularidad de ser reutilizables y te
ayudan a cumplir con el proverbio de oro Dont Repeat
Yourself (DRY) al hacer escalables tus aplicaciones. En esta
parte del modelo tambin juega la decisin de qu
modelo usars para almacenar informacin: Base de datos?
Web services? El modelo que elijas depende obviamente de
las necesidades de informacin de tu aplicacin. Actualmente
hay tutoriales de SQLite y WebServices que te pueden ayudar.

* Vista: la vista no es ms que la interfaz con la que va a
interactuar el usuario. En Android las interfaces las
construyes en XML. Suelo utilizar mucho la analoga de que
esta parte es realmente parecida a lo que hacemos en el
desarrollo web con los CSS. Contruyes el esqueleto en XML
que equivale al HTML de un sitio. Posteriormente, con ayuda
de estilos, que tambin los escribes en XML, puedes empezar
a darle formato de colores, posiciones, formato, etc. a
tu esqueleto. Esto equivale a los CSS. Si vienes de un
ambiente web, aprovecha ese conocimiento para crear
aplicaciones Android. Si quieres saber ms acerca de estilos,
sigue este tutorial.

* Controlador: finalmente nos topamos con el controlador
que son todas esas clases que te ayudarn a darle vida a esas
interfaces bonitas que ya construiste y te permitirn desplegar
y consumir informacin de o para el usuario. Estos
controladores se programan en lenguaje Java y son el core de
la aplicacin.

Puedes ver la ventaja? As es: puedes tener perfiles
especializados en construir cada uno de estos componentes y
tener un resultado de calidad en cada uno y al final obtener
una buena aplicacin. El truco para que todo salga bien es ser
disciplinados para poder ser programadores ordenados, eso es
vital en la aplicacin de esta arquitectura. Por experiencia, te
puedo decir que si te esfuerzas en construir una buena
arquitectura de aplicacin te ahorrars muchos dolores de
cabeza despus y te evitars tener que duplicar lneas de
cdigo que hacen lo mismo, podrs escalar fcilmente tu
aplicacin, agregar funcionalidades nuevas sin tanto embrollo
y por qu no?, facilitar el comienzo de nuevos proyectos.

Para empezar a aplicar esta arquitectura debes saber tambin
su flujo:

- Todo parte cuando el usuario interacta con tu aplicacin, el
jugador actual es la vista. (El usuario quiere mandar un
Tweet).

- El controlador recibe la notificacin de la accin solicitada.
(Por medio de un handler verificar si el usuario est
logueado o no en su cuenta de Twitter).

- El modelo es llamado para ser modificado. (Podemos
accesar al cach de tweets que se tenan desde la ltima vez
que el usuario abri la aplicacin y se conect a Internet y
agregar el nuevo tweet).

- Una vez que tenemos los nuevos tweets y la publicacin que
quiere hacer el usuario, el controlador nuevamente toma
partida para llamar a la vista correcta que desplegar el
Timeline actualizado.

- Listo! El usuario ya tiene la nueva interfaz para seguir
interactuando con la aplicacin y volver a iniciar el ciclo
cuando solicite otra accin.

Otra de las cosas que te ayudan a seguir este modelo es tener
ordenado tu proyecto. Utiliza las convenciones de los
lenguajes que utilices y las buenas prcticas para que sea ms
fcil acoplar a tus compaeros de equipo (no siempre uno solo
se echa el paquete de hacer una aplicacin y menos an si es
una compleja). Te aconsejo empezar con cosas tan sencillas
como el nombramiento de paquetes, clases y variables, y
despus organizar los recursos que vayas a utilizar delegando
siempre a cada componente lo que le corresponde.

En la web puedes encontrar muchos recursos que puedes leer
para ver ejemplos de la aplicacin de esta arquitectura. No es
algo nuevo pero algunos no la conocen. Sin importar que
encuentres un ejemplo para web, recuerda que en la
programacin nicamente cambia el lenguaje, la lgica y la
metodologa es la que se preserva.

Si an no utilizas esta arquitectura para construir tus
aplicaciones Android creo que es un buen momento para
tomarlo en cuenta y empezar a aplicar.