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:
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:
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.