You are on page 1of 89

Aprende Android en 20 conceptos.

Empezando a programar para


Android44

A da de hoy, Android dispone de cientos de millones de dispositivos mviles en


ms de 190 pases a lo largo del mundo. Y todo ello acompaado de ms de 1.5
billones de descargas de aplicaciones desde Google Play cada mes. Unos
nmeros asombrosos que a muchas personas les han llevado a querer aportar su
granito de arena, desarrollando su propia aplicacin. Quin no ha pensado
tener esa idea que poder llevar a cabo?

Por ello, y aportando mi propia experiencia como desarrollador de apps para


Android,hoy vamos a inaugurar una nueva seccin orientada a introducirnos
al desarrollo de aplicaciones para Android: la seccin Aprende Android en
20 conceptos.
En esta seccin haremos un recorrido por los 20 fundamentos bsicos de la
API (Application Programming Interface) de Android para poder programa una
aplicacin en Android, desde cero. Para quien no conozca lo que es una API,
bsicamente se trata de la funcionalidad que nos proporcionan (en este caso
Android) para poder programar.
Esto no quiere decir que con estos 20 conceptos lo conozcamos todo, ni por
supuesto que no haya otros conceptos tambin importantes. De lo que se trata es
de explicar aqulos conceptos generales ms importantes para crear una

buena estructura de nuestra aplicacin. Con esta base, profundizar en


conceptos ms especficos (como por ejemplo puede ser el acceso al GPS) ser
mucho ms sencillo.
Los 20 conceptos que trataremos en la seccin Aprende Android en
20 conceptos son los siguientes:
0. Empezando
1. Fundamentos de una aplicacin
2. Recursos de una app
3. La clase Activity
4. La clase Fragment
5. View personalizada
6. Adaptadores (Adapter)
7. La clase Intent
8. Receptores de mensajes broadcast (Broadcast Receiver)
9. Prefencias de una app (Shared Preferences)
10. Bases de datos SQLite
11. Servicios (La clase Service)
12. Tareas asncronas (La clase AsyncTask)
13. Gestores de contenidos (Content Provider)
14. La barra de acciones ActionBar
15. Notificaciones
16. Orientacin del dispositivo
17. Animaciones
18. Widgets
19. Otros conceptos
20. Informacin adicional
La seccin ser semanal, pero introduciremos ms de un concepto cada
semana, a partir de la prxima semana. En esta semana nos preocuparemos
de dejar nuestro ordenador preparado para empezar a programar en
Android.

0. Empezando
Lo primero ser saber que para programar aplicaciones nativas en Android,
deberemos aprender a programar en el lenguaje Java, conociendo
la programacin orientada a objetos.
Lo primero que debemos hacer es preparar nuestro entorno de desarrollo y saber
dnde conseguir cualquier informacin. Para ello, lo primero es saber dnde
est toda la informacin para los desarrolladores de Android. Google nos
tiene preparada una web para ello, pero debemos saber que toda la informacin
est en ingls:
Web de desarrolladores de Android

En esta web, tenemos 3 secciones bsicas: Diseo, Desarrollo y


Distribucin. En ellas, tendremos toda la informacin acerca de las
recomendaciones de Google para disear nuestra app, toda la informacin sobre
la API de Android e informacin para saber publicar nuestra aplicacin, sabiendo
cmo promocionarla, anunciarla
En la parte de abajo, tendremos informacin adicional, sobre Android, conseguir
el SDK (Software Development Kit), soporte
ste ser nuestro primer paso, descargarnos el entorno de desarrollo, para lo
que iremos a Get the SDK, o haremos click en el siguiente enlace:
Descargar el SDK

Una vez en la web, basta con que le demos al link que dice Download the SDK, y
nos bajar una versin del entorno de desarrollo Eclipse, personalizada para
Android y ya preparada con el ltimo SDK, el plugin ADT, as como
emuladores sobre los que poder testear nuestra aplicacin.
En el pasado Google I/O (2013), anunciaron tambin el nuevo IDE Android
Studio, el cual podemos tambin utilizar en lugar de Eclipse, pero debemos
saber que an estn en fase beta. Desde la misma pgina podrs acceder a la
informacin al mismo.Nosotros ya hemos hablado antes de este nuevo IDE,
pero en este tutorial utilizaremos Eclipse.
Una vez abrimos nuestro entorno de desarrollo, podemos descargarnos todas
las versiones de Android si queremos, as como otros paquetes extra. Para
ello utilizaremos el Android SDK Manager.

Por otro lado, podremos crear tantos emuladores de dispositivos Android como
queramos: con distintos tamaos de pantalla, distintas versiones de Android
Para ello, debemos utilizar el Android Virtual Device Manager (ADB), al cual
podemos acceder desde Eclipse o desde la va de comandos de nuestro sistema
operativo:

Aunque la mejor manera de tener control sobre nuestros dispositivos ser


aprendiendo a manejar ADB desde la lnea de comandos, algo de lo que
tambin hemos hablado. No obstante, en Eclipse podremos gestionar tambin
nuestros dispositivos y sacar informacin de nuestro dispositivo: desde capturas
de pantalla o ver los ficheros hasta enviar coordenadas GPS o enviar una
llamada. Para ello, iremos a Window / Open perspective / Other / DDMS. La
vista de Eclipse DDMS (Dalvik Debug Monitor Server) nos ser de gran utilidad
mientras desarrollemos nuestras aplicaciones. Disponemos de toda la
informacin sobre la misma en el siguiente enlace:

DDMS
Llegados a este punto, nuestro ordenador est preparado para crear nuestra
primera aplicacin Android. Para ello, nos basaremos en los pasos que Google
nos recomienda seguir para una sencilla app. Toda esta informacin la
podremos encontrar en unos trainings que Google nos tiene preparados:
Formacin (Trainings) sobre Android de Google
Creando un nuevo proyecto Android
Nuestra seccin hoy terminar siguiendo el segundo enlace, donde crearemos un
nuevo proyecto Android. Para ello, seguiremos los siguientes pasos:
1. Haz click en New
2. En la ventana que aparece, abrir la carpeta Android y elegir Android
Application Project
3. En la siguiente ventana, debemos introducir el nombre de nuestra
aplicacin, el nombre del proyecto y el nombre del paquete (ste ser
unico para nuestra app, pues sera el ID que Google Play utilizar para
identificar la aplicacin). Tambin introduciremos la versin de Android
mnima requerida, as como la versin con la que compilaremos (generar
nuestra aplicacin a partir del cdigo) nuestra aplicacin.
4. Tras rellenar todos los campos segn necesitemos o queramos, nos vamos
a la siguiente pantalla, donde dejaremos las opciones seleccionadas por
defecto.
5. En la siguiente pantalla, podremos crear un icono para nuestra aplicacin.
Para ello, sera ideal echar un vistazo a las guas de diseo de Android con
respecto a lo que a iconos se refiere.
6. Por ltimo, seleccionaremos una plantilla de actividad sobre la que empezar
a trabajar. Podemos seleccionar Blank Activity, que bsicamente es una
pantalla vaca.
7. Finalizamos el asistente.

Con esto, tendremos nuestro particular Hola mundo con el que siempre
empezamos a programar cuando utilizamos una nueva API (tambin vimos
cmo crear un Hola Mundo en AndroidStudio). Para ejecutarlo, basta con
tener un dispositivo real conectado o lanzar un emulador y hacer click en el
botn Run (un crculo verde con el icono Play en blanco).
1. Fundamentos de una aplicacin
Lo primero que tenemos que mencionar es que las aplicaciones Android estn
escritas en el lenguaje de programacin orientado a objetos Java. El SDK de
Android tiene una serie de herramientas que permitirn compilar el cdigo,
incluyendo los datos y los recursos (de los que hablaremos a continuacin), y lo
meter todo en un fichero APK, o tambin conocido como paquete Android.
Este fichero ser nuestro instalador.
Una vez instalada una aplicacin, cada una de ellas tiene su propio sistema de
seguridad, de tal modo que:

Cada aplicacin ser un usuario diferente dentro de Android como


Sistema Operativo basado en un sistema Linux multiusuario. Este
usuario ser un ID de usuario Linux nico.

Android dar permisos para todos los ficheros de una aplicacin


nicamente para el usuario que identifica dicha app.

Cada proceso tiene su propia mquina virtual, por lo que la ejecucin de


aplicaciones es totalmente independiente.

Por defecto, cada aplicacin corre en su propio proceso Linux, el cual


se gestiona a nivel de Sistema Operativo

Con todas estas reglas, Android consigue implementar lo que se conoce


como Principio de menor privilegio, consistente en otorgar los permisos justos
a cada aplicacin, de modo que el sistema sea lo ms seguro posible.

Pero todo esto es el funcionamiento por defecto, pues podremos gestionarlo


segn nos interese, por ejemplo para compartir datos entre diferentes
aplicaciones (un ejemplo perfecto son los Contactos).
Una vez conocido como funciona Android, es hora de pasar a definir
los componentes de una aplicacin. stos son los bloques bsicos que
podemos construir. Hay 4 diferentes tipos de componentes:

Activity: Representa una pantalla independiente con una interfaz de


usuario. A pesar de que nuestra aplicacin dispondr de mltiples
pantallas interconectadas entre s, nosotros deberemos generarlas
individual e independientemente (pudiendo pasar datos entre ellas, en caso
de ser necesario). Entraremos en ms detalle en esta clase cuando
lleguemos al concepto 3.

Service: Es un componente que corre de fondo para hacer operaciones


de larga duracin o trabajo en procesos remotos. Contrario a la
actividad, no dispone de interfaz grfica. Veremos ms detalles al llegar al
concepto 11.

Content Provider: Este componente nos permite gestionar un conjunto


de datos de la aplicacin para compartir. Los Contactos son el ejemplo
perfecto para este componente: datos que podemos compartir entre
diferentes aplicaciones. Pero podemos crear nuestro propio conjunto de
datos (ms detalle en el concepto 13).

Broadcast Receiver: El cuarto de los componentes nos permite responder


a anuncios broadcast del sistema. Un buen ejemplo es si queremos
gestionar cuando tengamos el aviso de batera baja (el cual enviar un
mensaje broadcast), aunque podemos disear nuestros propios mensajes
(ms detalles en el concepto 8).

Un aspecto interesante de diseo de Android es que una aplicacin A podra abrir


un componente de una aplicacin B. El ejemplo ideal es cuando queremos usar
la cmara en nuestra app, podemos hacer una Activity con la cmara, o abrir el

componente de la cmara que viene ya instalada por defecto en el sistema


operativo.
Para ello utilizamos un mensaje llamado Intent, el cual tambin sirve para activar
3 de los 4 componentes de una app (todos excepto el Content Provider), Ms
adelante veremos cmo hay mtodos especficos para abrir cualquier
componente a travs de un Intent (concepto 7).

Pero, cmo sabe nuestra aplicacin qu componentes tiene


disponibles? Para ello, existe el fichero AndroidManifest.xml. Este fichero ser
el encargado de comunicarle al sistema operativo:

las componentes de las que dispone la aplicacin

los permisos necesarios para la aplicacin (cmara, GPS)

la versin de Android mnima necesaria

el hardware y software requerido y/o usado

las librerias externas que utiliza (como Google Maps)

Para ello, utilizaremos etiquetas, que en el caso de los componentes sern:


<activity> <service> <receiver> <provider>
Cada una de estas etiquetas tendrn una serie de atributos disponibles, donde
indicaremos qu componente en cuestin ser de todos los disponibles, icono o
un sinfn de opciones disponibles. Adems, si queremos indicar las capacidades
de uno de nuestros componentes, podemos hacer uso de la etiqueta <intentfilter>.
2. Recursos de una app

A la hora de hacer un buen programa, siempre hay que externalizar los


recursos del cdigo, entendiendo por recursos imgenes, textos, estilos De
esta forma, tambin podremos especificar diferentes recursos dependiendo
del tipo de dispositivo en el que estemos, sin necesidad de modificar el
cdigo. Para esto, el ejemplo perfecto es la versin mvil y tablet de una misma
pantalla (o Activity, para ir entrando en la jerga): creamos una nica Activity la
cual utilizar una distribucin de su contenido diferente segn el tipo de
dispositivo que usemos.

Siempre podemos especificar un recurso genrico o por defecto. En


contraposicin a ste, tendremos la opcin de especificar que una versin
concreta de un recurso es para una configuracin especfica.
Para detallar la configuracin especfica podemos basarnos en idiomas,
resolucin, orientacin del dispositivo Para ello, basta ver las posibilidades en
esta pgina. Bsicamente radica en aadir unas terminaciones a las carpetas
donde almacenaremos los recursos, acordes a la configuracin especfica.

Todos los recursos irn bajo la carpeta /res. Pero, qu recursos son los que
podemos incluir? Los siguientes:

Animaciones

Colores

Imgenes (Drawable)

Layouts (Disposicin de elementos grficos)

Mens

Cadenas de texto (String)

Estilos

Otros (booleanos, dimensiones)

Para ello, deben ir en una estructura de carpetas especfica, de forma que por
ejemplo para aadir cadenas de texto en espaol utilizaramos la carpeta
/res/values-es o /res/drawable-xxhdpi para Drawables para pantallas de alta
resolucin.
A continuacin podis ver un diagrama de flujo de cmo Android elige el recurso
adecuado:

Teniendo claro cmo se gestionan los recursos, cmo creamos algunos


recursos especficos? Veamos a continuacin algunos de ellos: layouts, menus
y estilos.
Un layout define la estructura visual de una interfaz de usuario. A pesar de que
podramos crearla dinmicamente por cdigo, lo ideal es declarar los
elementos de la interfaz en un XML.
Para crear un layout, disponemos de muchos componentes grficos ya en la API,
aunque podemos crear los nuestros propios. Tenemos layouts donde insertar
mltiples componentes, vistas de texto, botones A continuacin, podis ver un
ejemplo de un layout que nos pondr un texto y justo debajo un botn:

En este caso, un LinearLayout nos pondr elementos uno detrs de otro (en este
caso al ser su orientacin vertical, uno debajo de otro). A continuacin un
TextView que de ancho y alto ocupa lo que necesite (wrap_content), con el
texto Hello, I am a TextView. Y similar para el botn. Cada uno con su
identificador nico.
Si queremos hacernos buenos a la hora de hacer layouts, lo ideal es
que empecemos trabajando con el editor grfico de eclipse o Android
Studio, pero vayamos comprobando cmo queda el XML. Conforme pase el
tiempo, os daris cuenta que a veces ser ms rpido escribir directamente en el
XML.
Cuando vamos a definir un men en una de nuestras Actividades, ste tambin
se define a travs de un XML. Para ms informacin, os recomiendo visitar
el link. Aqu os dejo un ejemplo:

Por ltimo, cuando hablamos de estilos, nos estamos referiendo al concepto ms


parecido a lo que es CSS para una web: externalizar estilos para poder ser
reutilizados. Podremos definir estilos para asignarlos a entidades grficas, as
como crear un temapara asignarlo a toda la aplicacin.
A continuacin podis ver como mostrar un texto con un formato especfico:

Y como queda tras utilizarlo con estilos, donde el estilo CodeFont podramos
reutilizarlo en otras Views, o si decidiramos cambiarlo, podramos cambiarlo a
todos a la vez:

Llegados este punto, creo que es el momento de mencionaros la gua de diseo


de interfaces para Android, una web donde podremos ver las tendencias y
consejos sobre cmo montar una buena interfaz de usuario.
Por ltimo, para jugar un poco con la asignacin de recursos para diferentes
configuraciones, estara bien que sigis este ejemplo de Google.
Con esto damos por terminados los dos primeros conceptos de esta seccin. Es
cierto que estos dos conceptos son muy densos, pues son conceptos donde
pretendo explicar la estructura de la aplicacin, pero muchos de las cosas
que nombramos son las que iremos analizando a posteriori.

3. La clase Activity
Una Actividad es uno de los componentes de una aplicacin, concretamente el
encargado de ofrecer una pantalla con la que los usuarios pueden
interactuar, con el nico objetivo de hacer algo. Es por ello que lleva asociada
una interfaz de usuario.
De hecho, una aplicacin suele estar compuesta por varias actividades que estn
vinculadas unas a otras de alguna forma. Generalmente, toda aplicacin tiene

una actividad considerada la actividad principal (main), la cual es la que se


muestra al usuario cuando se abre la aplicacin por primera vez.
Como desarrolladores, podremos lanzar nuevas actividades desde otras
actividades, de tal forma que la actividad lanzadora es pausada, pero el sistema
la mantiene en memoria en una cola denominada back stack. Bsicamente esta
cola consiste en una cola tipo LIFO (Last In, First Out), o lo que es lo mismo, la
ltima actividad que fue aadida, ser la primera en la cola. As, cuando el
usuario pulse el botn atrs (Back), el sistema nos quitar la actividad actual y
nos mostrar justo la anterior en la cola, aunque este comportamiento por defecto
puede ser modificado segn nuestro inters.

Varias actividades pertenecern a una tarea (task), la cual se define como un


conjunto de actividades destinados a un trabajo determinado. A nivel de Manifest
podemos gestionas las tareas, con la definicin de algunos atributos (taskAffinity,
launchMode, allowTaskReparenting, clearTaskOnLaunch,
alwaysRetainTaskState, finishOnTaskLaunch)y flags o banderas
(FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_CLEAR_TOP,
FLAG_ACTIVITY_SINGLE_TOP), de los cuales puedes consultar ms
informacin en la documentacin.
Sin embargo, el comportamiento por defecto se puede entender bastante bien
en este ejemplo:

La Actividad A lanza B

A para y guarda su estado

Le damos el botn Home

Se mantiene el estado de cada actividad en la tarea

Le damos a Back

La actividad actual de la sale de la pila backstack y se destruye

Como connotacin final sobre la pila backstack, mencionar que las actividades
pueden ser instanciadas ms de una vez.
Para crear una actividad, basta con que creemos una clase que herede de la
claseActivity. Adems de heredar de esta clase, deberemos sobreescribir

algunos mtodos que pertenecen al ciclo de vida de la actividad. Este ciclo de


vida consiste en los diferentes estados por los que puede pasar una actividad y
los mtodos que nos permiten cambiar de un estado a otro. De este
modo, podemos distinguir los siguientes estados:

Resumed: En este estado, la actividad est en primer plano para el sistema

Paused: La actividad est an visible, pero el foco est en otro componente


que est por encima de sta

Stopped: La actividad an est viva, pero est totalmente oculta

De esta forma, podemos distinguir 3 procesos principales en la actividad:

Tiempo de vida completo: Entre onCreate y onDestroy

Tiempo de vida visible: Entre onStart y onStop

Tiempo de vida en primer plano: Entre onResume y onPause

Tal como he comentado, en los cambios de un estado a otro, la actividad ir


ejecutando una serie de mtodos. Estos mtodos son los considerados
pertenecientes al ciclo de vida de la misma. Para nosotros, los dos ms
importantes son:

onCreate: El sistema llama este mtodo al iniciar una actividad, y en l


deberemos iniciar todos los componentes de la actividad. Adems, este

mtodo deber llamar siempre al mtodo setContentView, encargado de


cargar la interfaz grfica (un recurso layout, indicado a travs de su ID) que
la actividad utilizar.

onPause: Es el primer mtodo que se llama cuando el usuario est


abandonando la actividad. Es el mtodo donde deberemos guardar todos
los cambios que queramos que sean persistentes cuando el usuario
abandone esta pantalla.

Pero cuando queremos optimizar nuestra aplicacin, deberemos sobreescribir


tambin otros mtodos del ciclo de vida, los cuales son:

Para terminar una actividad, basta con que llamemos al mtodo finish.
Como componente de una aplicacin que es, la actividad deber ser
registrada en el fichero Manifest. Para ello, utilizaremos la
etiqueta <activity> dentro de la etiqueta <application>. Adems, dentro de la
actividad, podremos declarar todos los <intent-filter> que queramos, para
identificar nuestra actividad y las acciones que puede realizar. Como ejemplo
bsico, la actividad considerada main, deber llevar la categora LAUNCHER y la
accin MAIN:

Llegados este punto, sabemos definir una actividad, incluirla en el Manifest e,


incluso, establecerla como la actividad principal. Pero cmo lanzar una
actividad? Para ello tenemos dos posibles formas, pero siempre mediante el uso
de Intent y el mtodo startActivity:

Implcita: Sabemos qu actividad vamos a lanzar, y suele ser una


perteneciente a nuestra propia aplicacin

Explcita: Sabemos la funcionalidad que queremos hacer, pero al no


conocer qu actividades pueden hacerlo (de nuestra aplicacin o de otras),
delegamos en el sistema operativo. ste, segn sus categoras, acciones
buscar las posibilidades y nos la dar a elegir. Cmo distingue el sistema
entre todas sus actividades? Pues precisamente mediante el uso de
los <intent-filter> que hemos mencionado anteriormente.

Adems, podemos necesitar lanzar una actividad pero esperar un resultado


para volver a nuestra actividad previa. Para ello, en lugar
de startActivityutilizaremos startActivityForResult. De esta forma, podremos
registrar los resultados que nosotros deseemos y nuestra actividad previa estar
esperando a uno de estos resultados para lanzar alguna funcionalidad especfica:

Y qu ocurre cuando una actividad es pausada pero an no


destruida? Para ello, podemos hacer uso del salvado de estado de la actividad,
sobreescribiendo el mtodo onSaveInstanceState, gracias al cual podremos
salvar todos aquellos datos que queramos, y sern recuperados al restaurar la
actividad:

Otras cosas que podemos hacer con la actividad es registrar cambios en la


misma, tales como cambios de orientacin, del estado del teclado, de idioma..
Para ello haremos uso del mtodo onConfigurationChanged:

Pero este mtodo slo se disparar ante los eventos que hayamos
registrado en el Manifest, mediante el atributo android:configChanges. A
continuacin puedes ver un ejemplo de registro de eventos de teclado y de
orientacin del dispositivo:

Por ltimo, mencionar que podemos hacer uso de los Loaders, cuando
queramos poder precargar de forma asncrona (tanto en actividades como en
fragmentos) informacin proveniente de algn ContentProvider.
En el siguiente enlace tenis un ejemplo perfecto completo para comprender
mejor las actividades y sus ciclos de vida.

4. La clase Fragment

Con la llegada de las tablets, las actividades parecan no satisfacer todas las
necesidades que stas traan consigo. Por qu? La respuesta es sencilla: ahora
tenemos ms pantalla para mostrar ms datos, pero no nos gustara tener que
rehacer el cdigo haciendo actividades totalmente nuevas. Con toda esta idea,
surge el conceptofragmento desde Android HoneyComb 3.0 (API 11).
Un fragmento representa una porcin de interfaz de usuario o un
comportamiento en una actividad. De esta forma, podemos combinar varios
fragmentos en una nica actividad, de tal forma que podemos crear un panel
multi interfaz y reusar un fragmento en diferentes actividades. Quin no ha visto
el tpico caso de datos maestro (izquierda) esclavo (derecha) en una tablet, que
en su versin mvil son dos pantallas independientes, la cual la primera nos lleva
a la segunda?

Un fragmento debe siempre ser incluido en una actividad, y su ciclo de vida


est totalmente relacionado con el ciclo de vida de la actividad que lo
contiene. De esta forma, por ejemplo, si una actividad es pausada, todos sus
fragmentos lo sern tambin.
He comentado que los fragmentos fueron incluidos en HoneyComb, pero han
resultado ser tan trascendentales, que Google nos ha facilitado una librera de
retrocompatibilidad, de modo que podamos usar los fragmentos en versiones
anteriores, si deseamos que nuestra aplicacin sea compatible (por ejemplo, con
Gingerbread).
La transicin de fragmentos dentro de una actividad se hace por medio
de fragmenttransaction, las cuales podemos aadir a la cola backstack de
nuestra actividad. De esta forma, mediante el uso del botn Back podremos
deshacer una transaccin de fragmentos y volver a uno anterior, muy similar a
como hacamos con la gestin de la cola en las actividades.
De todas formas, para gestionar los fragmentos dispondremos de diferentes
mtodos, tanto para encontrar un fragmento concreto (findFragmentById
/findFragmentByTag) o para gestionar la cola backstack (popBackStack -el
cual permite deshacer un cambio del backstack/ addOnBackStackChangedListener).
Hemos hablado de que los fragmentos tienen su propio ciclo de vida, pero
ntimamente relacionado con el de su actividad contenedora. Si bien esto es
cierto, hay que decir que el ciclo de vida es muy similar al de la actividad, pero
con ligeras diferencias. En el caso de los fragmentos, la inicializacin de la
interfaz grfica o layout se har en el mtodo onCreateView, y no ser llamando
al mtodo setContentView, sino que el objeto de la clase View que
devuelva onCreateView ser el objeto que se mostrar como interfaz grfica.
Para ello haremos uso de un inflater.

Los mtodos que permiten coordinar el ciclo de vida de un fragmento con


una actividad son:

onAttach: Llamado cuando el fragmento ha sido asociado con la actividad

onCreateView: Llamado para crear la vista asociada con el fragmento

onActivityCreated: Llamado cuando termine el mtodo onCreate de la


actividad

onDestroyView: Llamado cuando se elimina la vista asociada al fragmento

onDetach: Llamado cuando el fragmento est siendo eliminado de la


actividad

No obstante, en todo momento tendremos acceso a la actividad contenedora de


un fragmento mediante la llamada al mtodo getActivity.
Otra opcin muy importante es cuando queremos que un fragmento ejecute cierta
funcionalidad asociada a la actividad, que desconoce y tan slo quiere delegar en
la actividad e indicarle que debe ejecutarla. Para ello haremos uso
de callbacks. Un callback nos permite implementar una interfaz con nuestra
actividad, y obtener una instancia de esa actividad implementada en nuestro
fragmento y que sea este objeto quien llame a la funcionalidad en cuestin, la
cual pertenecer a la actividad.
Los fragmentos tendrn los mismos estados que las actividades: resumed,
paused, stopped.

Puesto que los fragmentos no son componentes de una aplicacin, stos no


deben ser declarados en el Manifest. Pero, cmo aadimos un fragmento a
una actividad?Para ello, tenemos dos opciones:

Declarando el fragmento de manera esttica en el layout de una actividad

Aadiendo dinmicamente en cdigo el fragmento a un objeto ViewGroup


existente

Por ltimo, mencionar que Google, para hacernos las cosas ms fciles, nos
ofrece algunos fragmentos particulares ya creados, de tal forma que nos
resulta mucho ms fcil desarrollar cierta funcionalidad. Entre ellos, encontramos:

DialogFragment: Es un fragmento que nos permite mostrar un dilogo

ListFragment: Fragmento para gestionar una lista de vistas que se repiten.


Perfecto para cualquier lista

PreferenceFragment: Fragmento para gestionar preferencias de la


aplicacin. Hay que remarcar que este tipo de fragmento no est incluido
dentro de los compatibles en la librera de retrocompatibilidad, por lo que no
podremos hacer uso de ellos en versiones anteriores a Honeycomb.

Al igual que las actividades, la mejor forma de comprender los fragmentos es un


ejemplo completo de cmo funcionan, el cual podis encontrar aqu.
Con esto damos por terminada la seccin por hoy, habiendo explicado cmo
funcionan las pantallas que vemos en una aplicacin, ya sean completas
(actividades) o parciales (fragmentos). El uso de estos dos conceptos es vital
para el desarrollo de una buena aplicacin, especialmente el conocimiento
de sus ciclos de vida. Llegar un punto que un setContentView, un onResume,
etc ser ms normal para vosotros que muchas cosas casi vitales de la vida
misma.

5. View personalizada
Como programadores, la plataforma Android est constituida en un modelo
basado en unos componentes muy potentes y sofisticados, de forma que
podremos prcticamente crear cualquier interfaz grfica posible. Para ello, nos
basaremos en las clases fundamentales de los layouts: las
clases View y ViewGroup. La clase View representa el bloque bsico para
cuando queremos crear una interfaz grfica. Por su parte, un ViewGroup no es
ms que una View especfica que nos permite contener otras Views. Estas dos
clases sern los componentes centrales de cualquier interfaz Android.
La API de Android nos ofrece de serie una variedad de Views (en la API
llamadas widgets) y ViewGroups (layouts) sobre los que podemos empezar a
trabajar. Estos son algunos de los ejemplos que podemos encontrar:

Views: Button, TextView, EditText, ListView, CheckBox, RadioButton,


Gallery,Spinner, AutoCompleteTextView, ImageSwitcher, TextSwitcher

ViewGroups: LinearLayout, FrameLayout, RelativeLayout

Puesto que los layouts son algo de lo ms importante para nosotros, aqu tenis
toda la informacin respecto a ellos.
Con todo esto, ya podramos crear una interfaz grfica, mediante la combinacin
de los mismos.

Pero, qu hacemos cuando lo que queremos no est disponible en uno de


estos objetos incluidos de serie? La respuesta es sencilla: disear el nuestro
propio a partir de uno de ellos o de una View genrica.

Al crear nuestra propia View, conseguimos un control preciso sobre la


apariencia y la funcionalidad de un elemento que incluiremos en la pantalla. stas
son algunas cosas de las que podemos llegar a hacer:

Crear una View totalmente personalizada, usando incluso grficos 2D

Combinar un grupo de Views en un nuevo componente individual

Sobreescribir un componente ya existente para dotarlo de funcionalidad


aadida o modificada

Capturar otros eventos en algn componente ya creado

Analicemos primero la aproximacin bsica. En esta posibilidad, consideramos


los siguientes pasos:
1. Crear una clase que extienda de una View ya existente (cualquiera de las
anteriores por ejemplo)
2. Sobreescribir alguno de los mtodos de la clase padre. Para saber qu
metodos podemos sobreescribir, todos ellos empiezan por on, como por
ejemplo onDraw, onMeasure, onKeyDown
3. Utilizar la nueva clase.

Pero si esto no nos provee la funcionalidad que buscamos, deberemos acudir a


una vista totalmente personalizada, para la cual deberemos seguir los
siguientes pasos:
1. Crear una clase que extienda de la clase View.
2. Proveer un constructor que pueda coger atributos y parmetros del XML o
facilitados por nosotros mismos
3. Crear nuestros propios escuchadores de eventos, modificadores
4. Sobreescribir los mtodos onMeasure (si no lo sobreescribimos, por defecto
este mtodo devolver una vista con tamao 100 x 100) y onDraw (por
defecto no hace nada). De esta forma podremos personalizar lo que
mostramos.
5. Sobreescribir otros mtodos de los que empiezan por on.
Hemos hablado de los mtodos onMeasure y onDraw, pero para qu sirven
exactamente?

onMeasure: Es una pieza crtica en el renderizado entre el componente y


su contenedor padre. Deberamos sobreescribirlo para poder calcular sus
dimensiones de forma eficiente.

onDraw: Nos proporciona un Canvas donde podremos implementar


cualquier cosa que no sea grficos 3D.

Sin embargo, cuando no queremos crear un componente totalmente


personalizado y nos gustara juntar varios componentes reutilizables, utilizaremos
un componente compuesto. Para ello:
1. El punto de partida habitual suele ser un Layout para nuestra nueva clase
2. Crearemos un constructor, de forma similar a anteriormente
3. Aadiremos todos los escuchadores que creamos convenientes
4. En el caso de que estemos extendiendo de un Layout, podemos olvidarnos
de sobreescribir los mtodos onDraw y onMesaure (si queremos)
5. Sobreescribimos los mtodos que empiecen por on que necesitemos

Imaginemos que queremos sobreescribir una vista que ya exista. En ese caso
deberemos:
1. Definir la nueva vista
2. Inicializar la clase
3. Encarganos de los mtodos que debemos sobreescribir
4. Usar la nueva vista

Aqu podis ver un ejemplo perfecto de una nueva vista personalizada. En este
caso se trata de un grfico por sectores.

6. Adaptadores (Adapter)
Hasta ahora hemos visto cmo crear interfaces de usuarios sencillas, donde
nosotros indicbamos el layout a utilizar e incluso metamos nuestras propias
vistas personalizadas.
Pero, y si queremos repetir una interfaz repetidas veces segn unos datos
concretos? Es el caso de una lista de valores, una galera Y aqu es donde
entran en juego los adaptadores.

Qu es un adaptador? Un adaptador (clase Adapter) es un puente de


comunicacin entre un AdapterView (el cual nos permite incluir el layout con la
vistas en tiempo de ejecucin) y los datos que queremos mostrar en la vista. De
esta forma, dinmicamentese ir actualizando la interfaz con nuestros datos.
Como siempre, Android nos facilita algunos ya creados por defecto, los ms
utilizados. Entre otros, destacan:

ArrayAdapter: En este caso los datos estn formados por un Array, y el


procedimiento de mostrar los datos en la vista consiste en utilizar el
mtodo toString que todo objeto Java tiene para cada elemento del Array.
En el caso de que queramos personalizacin adicional, deberemos crear
una clase que extienda de ArrayAdapter y sobreescribir el
mtodo getView, donde podremos modificar cada vista dinmicamente. Un
ejemplo ideal es cuando queremos hacer una lista de TextView.

SimpleCursorAdapter: En este caso los datos estn incluidos en un


Cursor y ser necesario especificar un layout a utilizar para cada fila del
cursor. Cuando queramos notificar que han cambiado los datos en el cursos
y la interfaz debe actualizarse, bastar llamar al
mtodo notifyDataSetChanged.

Por ltimo, mencionar que tambin podremos gestionar eventos como el


pulsado (click) en cada elemento. Para ello basta implementar la
clase OnItemClickListener.

Con esto, ya deberamos ser capaces de no slo de crear nuestras propias


componentes personalizadas (echadle un ojo al cdigo del grfico por
sectores!) para la interfaz, sino tambin crear listas de datos de forma
dinmica.
La semana que viene analizaremos otra clase importante, como es el Intent y
aprenderemos cmo enviar mensajes broadcast dentro de nuestra aplicacin, as
como registrarlos. Tambin cmo captar los mensajes que el mvil va enviando a
todas las aplicaciones.

7. La clase Intent

Un Intent es un mensaje que podemos utilizar para solicitar una accin


determinada a otra componente de una aplicacin. Se trata de una clase que
nos facilita la comunicacin entre componentes, principalmente en uno de estos
casos bsicos (mecanismos diferentes segn el tipo de componente que
queramos lanzar):

Empezar una actividad: Con un Intent podemos empezar una nueva


instancia de una Actividad, gracias al mtodo startActivity. En el Intent
introduciremos la informacin de la actividad a empezar, as como cualquier
otro dato que la actividad necesite.

Empezar un servicio: Totalmente similar al anterior, pero utilizando el


mtodo startService. Pero tambin hay que destacar, que si el servicio est
diseado con una interfaz cliente-servidor, podremos utilizar el
mtodo bindService.

Enviar un broadcast: Con un Intent y uno de los mtodos sendBroadcast,


sendOrderedBroadcast o sendStickyBroadcast, podremos enviar mensajes
broadcast al sistema operativo de nuestro dispositivo.

Qu informacin contiene un Intent? Bsicamente, portar informacin que el


sistema operativo utilizar para determinar qu componente lanzar, as como
cualquier informacin adicional que la componente pueda necesitar para poder
llevar a cabo su accin.
La informacin principal que podemos encontrar en un Intent es la siguiente:

Component Name (Nombre de componente): En este campo podremos


indicar el nombre del componente que queremos lanzar. Es opcional, pues
no siempre conoceremos el componente a lanzar (imagina que queremos
lanzar la cmara, pero no sabemos qu actividad utilizar). Slo ser
obligatorio en el caso de un servicio.

Action (Accin): Se trata de una cadena de texto que nos permite


especificar una accin a ejecutar (ya sea una disponible en Android o la
nuestra propia). En el caso de los mensajes broadcast, este campo ser
esencial, pues ser en base al que lanzaremos los diferentes mensajes.

Data (Datos): Ser una URI que haga referencia a los datos que queremos
utilizar, as como el tipo de datos que son (MYME type).

Category (Categora): Es una cadena de texto que ofrece informacin


adicional sobre el tipo de componente que debera ser lanzado.

Extras (Extras): Aqu podremos meter tantos pares llave-valor como


queramos como informacin adicional que queremos enviar al componente
a lanzar.

Flags (Banderas): Son metadatos que ayudan a indicar al sistema cmo


lanzar, por ejemplo, nuestra actividad.

Tal como hemos comentado, habr situaciones en las que sabemos qu


componente queremos lanzar. Pero habr otras donde conoceremos qu
queremos hacer, pero no qu componente exacto lo hace (por ejemplo, lanzar la
cmara). Es por ello que se definen dos tipos de Intents:

Intent Explcito: Este tipo de Intent es aquel en el que conocemos


exactamente qu componente lanzar, el cual especificaremos a travs
del nombre de componente. Lo utilizaremos cuando querramos lanzar un
servicio o actividad, tpicamente de nuestra propia aplicacin.

Intent Implcito: En este caso, no conocemos el nombre de


componente (estar vaco), pero sabemos la accin que queremos
ejectuar. De esta forma, le pediremos al sistema operativo que busque por
nosotros qu aplicacin podra realizar dicha accin y, en el caso de que
haya varias, nos dar a elegir cul utilizar.

La pregunta que nos podramos hacer llegado este punto es: cmo sabe
Android qu acciones realiza cada componente de aplicacin? Y aqu es
donde juega un papel crucial el fichero Manifest. En l, ya hemos comentado que
debemos dejar registrados todos los componentes que forman parte de la
aplicacin. Pero no slo eso. Tambin deberemos aadir dentro de cada
componente en el Manifest el concepto de Intent Filter. Este filtro nos permite
indicar cul es la capacidad de dicha componente. Concretamente, un Intent
Filter puede contener los siguientes campos completos:

Accin

Datos

Categora

Entonces, cuando nosotros lancemos un Intent implcito, Android buscar en


todos los Manifest de todas las aplicaciones instaladas aquellos
componentes que cumplan los requisitos de nuestro Intent: todos y cada uno
de ellos. Es decir, tendremos que cumplir los requisitos de accin, categora y
datos:

En el siguiente link, tenis una serie de lecciones donde podis descubrir ms


informacin sobre la interaccin con otras aplicaciones a travs de Intents.

8. Receptores de mensajes broadcast (Broadcast


Receiver)

Un broadcast es un mensaje que cualquier aplicacin puede recibir. El


propio sistema operativo ya de por s enva varios mensajes o anuncios
broadcast segn los eventos que tengan lugar (por ejemplo, en un reinicio del
dispositivo, al conectarlo a un cargador o al saltar el estado de batera baja, entre
otras muchas opciones). Nosotros, como programadores, podemos decidir cules
deberan ser capturados en nuestra aplicacin y cmo los gestionamos.
Para registrar un evento en un receptor de broadcast concreto en nuestra
aplicacin, deberemos hacer uso del mtodo registerReceiver o publicarlo
estticamente a travs de la etiqueta <receiver> en nuestro fichero Manifest. Sin
embargo, si slo deseamos enviar estos mensajes a nivel interno de nuestra
aplicacin, podramos usar la clase LocalBroadcastManager en su lugar.

Hemos visto cmo registrar el receptor de broadcast y los eventos asociados,


pero tambin debemos eliminarlo del registro. Para ello utilizaremos el
mtodo unregisterReceiver.
Por ltimo, mencionar que hay dos tipos de broadcasts:

Broadcasts normales: Son completamente asncronos, de forma que


todos los receptores corren en un orden desconocido, incluso al mismo
tiempo. Es ms eficiente, pero perdemos control en el orden de las
acciones a realizar.

Broadcasts ordenados: En este caso, el mensaje se enva a un slo


receptor a la vez. Cada receptor tendr un turno en el cual recibir el
mensaje, y propagar el resultado al siguiente receptor o incluso cancelar el
mensaje. Podremos controlar el orden con prioridades, pero perderemos
eficiencia.

Con esto damos por terminados los conceptos de hoy, donde ya hemos
visto cmo comunicarnos entre aplicaciones, as como solicitar al sistema
operativo alguna accin en concreto.
La semana que viene llegaremos al ecuador de la seccin. Pero mientras
tanto, has empezado ya a desarrollar tu primera app?
Nuevo domingo, nuevo captulo de Aprende Android en 20 conceptos. Con
este artculo de hoy llegamos al ecuador de la seccin, habiendo hablado ya de
10 de los 20 conceptos que componan el ndice inicial.
Antes de empezar con el concepto 9, cabe mencionar que hoy lo que
pretendemossolucionar, tal como hemos comentado antes, es el problema del
almacenamiento persistente de datos en nuestra aplicacin. Pero adems
necesitamos decidir si estos datos son privados para nuestra aplicacin o
pueden ser compartidos por otras aplicaciones.
Para ello, Android nos da las siguientes opciones:

Shared Preferences: Permite almacenamiento privado para datos


primitivos en parejas clave-valor.

Almacenamiento interno: Permite almacenamiento privado en la memoria


del dispositivo.

Almacenamiento externo: Permite almacenamiento pblico de datos en la


memoria externa compartida.

Bases de datos SQLite: Almacenamiento de datos estructurados en una


base de datos privada.

Conexin de red: Almacena datos en la web con tu propio servidor de red.

Aparte de todo esto, Android nos proporciona una forma adicional de mostrar
nuestros datos privados a otras aplicaciones, con el uso de un Content Provider.
Pero eso es algo de lo que hablaremos ms adelante.

9. Preferencias de una app (Shared Preferences)


La clase SharedPreferences proporciona la funcionalidad general que nos
permite guardar y leer tipos de datos primitivos (booleans, floats, ints, longs,
strings) en el formato clave-valor. Los datos sern persistentes en todo momento
(incluso cerrando la aplicacin o cambiando de sesin de usuario).

Cuando queramos hacer uso de esta funcionalidad, lo primero que deberemos es


conseguir tener un objeto de dicha clase, para lo cual tendremos que usar uno de
los siguientes mtodos:

getSharedPreferences: Ideal cuando necesitamos varios ficheros de


preferencias identificados por nombre, el cual indicaremos como parmetro.

getPreferences: Este caso lo utilizaremos cuando slo necesitamos un


fichero de preferencias para nuestra actividad, ya que no necesitaremos
indicar ningn nombre.

Si queremos leer valores, utilizaremos mtodos getters, tales como getBoolean,


getString, getInt
Pero si queremos escribir datos, deberemos seguir los siguientes pasos:
1. Llamar al mtodo edit para conseguir un objeto de la
clase SharedPreferences.Editor
2. Aadir todos los valores que queramos con mtodos put tales
como putBoolean, putString, putInt
3. Confirmar los nuevos valores llamando al mtodo commit.
A continuacin podis ver un ejemplo:

Tambin hay que destacar que si lo que queremos es crear preferencias de


usuario para nuestra aplicacin, podemos utilizar la clase PreferenceActivity,
que nos provee funcionalidad para crear preferencias de usuario que sern
automticamente almacenadas de forma persistente, usando precisamente
Shared Preferences.

10. Bases de datos SQLite


Las SharedPreferences resultan muy tiles, pero almacenas valores tipo clavevalor muchas veces resulta insuficiente. Para ello tenemos otras alternativas,
como es elalmacenado de datos estructurados en una base de datos

privada, mediante SQLite. Estas bases de datos sern privadas para cada
aplicacin y ninguna otra tendr acceso a estos datos.
La forma recomendada de crear una nueva base de datos SQLite es crear una
subclase de SQLiteOpenHelper y sobreescribir el mtodo onCreate, en el cual
podemos ejecutar comandos SQLite para crear las tablas necesarias en la base
de datos. A continuacin podemos ver un ejemplo:

Para tener un objeto de la clase creada, basta con que usemos el constructor que
hayamos definido. Una vez tengamos el objeto, escribir y leer de la base de
datosllamar a los mtodos getWritableDatabase y getReadableDatabase,
respectivamente. Ambos mtodos devolvern un objeto de la
clase SQLiteDatabase que representa la base de datos y nos provee los
mtodos para las operaciones SQLite que queramos.
Para ejecutar operaciones SQLite, utilizaremos los
mtodos SQLiteDatabasequery, que acepta varios parmetros para nuestra
consulta, tales como la tabla, seleccin En el caso de que queramos consultas
ms complejas, tambin podemos utilizar la clase SQLiteQueryBuilder.

Como resultado a las llamadas anteriores, recibiremos un Cursor que apuntar


a las filas encontradas por nuestra consulta. Este Cursor ser siempre para
nosotros el mecanismo por el que podremos navegar por los resultados de una
consulta a base de datos.
Para ir concluyendo, indicar que Android no impone ninguna limitacin a parte de
las que tengamos ya por el hecho de usar SQLite. Pero s que se recomienda
incluir un valor clave autoincremental para tener un identificador nico para
cada entrada en nuestra base de datos. De hecho, si quisiramos usar Content
Providers, ser obligatorio su uso.
Para ver cmo funcionan las bases de datos SQLite en plena accin, podis
echar un vistazo a los ejemplos que nos proporciona Google.
Y con esto llegamos al ecuador de la seccin. Con ganas de la segunda
mitad de Aprende Android en 20 conceptos?

11. Servicios (La clase Service)


Cuando queremos escuchar msica, administrar transacciones con la red o todo
este tipo de acciones que llevan tiempo y van en segundo plano mientras
hacemos otra cosa, debemos utilizar el concepto de servicio.
Un servicio es uno de los componentes de la aplicacin, el cual nos permite
realizar operaciones de larga duracin en segundo plano, sin requerir una
interfaz de usuario. Un servicio no tiene por qu depender de que una aplicacin
est en primer plano o no.
Hay dos formas de gestionar un servicio:

Empezado: el mtodo startService nos permite que corra en segundo plano


indefinidamente (incluso cuando destrozamos el componente que lo
empez.

Ligado: el mtodo bindService ofrece una interfaz cliente-servidor que


permite a los componentes interactuar con el servicio, enviar peticiones,
obtener resultados, y realizar procesos con comunicacion interprocesal
(IPC).

Pero hay que tener cuidado, pues el servicio se ejecutar en la hebra principal
de su proceso padre, por lo que si vamos a hacer un trabajo intensivo en la
CPU, deberamos crear una nueva hebra.
Cules son los principios bsicos de los servicios? Los siguientes:

Extender la clase Service y sobreescribir mtodos

Mtodo onStartCommand: Es llamado cuando otro componente solicita


que el servicio empiece (startService). Pero es nuestra responsabilidad
parar el servicio (stopSelf o stopService). Este mtodo debe devolver uno
de los siguientes valores:
o

START_NOT_STICKY: Si el sistema matase al servicio, no se


recrear el servicio a menos que haya an Intents pendientes de ser
procesados. Es la opcin ms segura para evitar que el servicio est
funcionando cuando no es necesario.

START_STICKY: Recrea el servicio y llama a onStartCommand con


un Intent null, pero no reenva el ltimo Intent.

START_REDELIVER_INTENT: Recrea el servicio y llama


a onStartCommand con el ltimo Intent que fue liberado al servicio

Mtodo onBind: Es llamado cuando otro componente quiere asociarse con


el servicio. Este mtodo siempre debe ser implementado. En caso de
que no queramos permitir asociaciones, basta con devolver null.

Mtodo onCreate: Llamado cuando el servicio es creado por primera vez.

Mtodo onDestroy: Llamado cuando el servicio no est siendo usado ms


y est siendo destruido. Sirve para limpiar recursos de memoria.

Dentro de su ciclo de vida, podemos


distinguir dos fases:

Ciclo de vida completo: Entre onCreate y onDestroy.

Ciclo de vida activo: Entre onStartCommand/onBind y unBind (en el


segundo caso). Para el primer caso no hay un mtodo de finalizacin del
ciclo de vida activo.

Como componente de una aplicacin que es, debemos declararlo en el


Manifest.

Para crear un servicio, aparte de la clase Service, podemos utilizar la


clase IntentService, la cual es una subclase de Service que usa una hebra
adicional para administrar todas las peticiones de comienzo, de una en una. Es la
mejor opcin si no necesitamos que el servicio administre mltiples peticiones
simultneamente.

Podremos enviar notificaciones al usuario, ya sea a travs de Toast o de


la barra de notificaciones.
Por ltimo, tambien podremos ejecutar un servicio en primer plano:

Ser un servicio considerado a hacer algo que el usuario necesita siempre


activo, por lo que no ser un candidato para ser destruido por el sistema
cuando haya problemas de memoria.

Debe proveer una notificacin en la barra de estado, bajo la


cabecera Ongoing, lo que significa que la notificacin no puede ser
eliminada a menos que el servicio sea parado o eliminado.

Se utilizan los mtodos startForeground/stopForeground

En el siguiente link podrs ver algunos ejemplos de buen uso de los servicios.

12. Tareas asncronas (La clase AsyncTask)


Todos los componentes de una aplicacin corren en el mismo proceso, y la
mayora de las aplicaciones no deberan cambiar este comportamiento, aunque
podemos hacerlo en el Manifest con la etiqueta android:process.
Hay 5 niveles de importancia para los procesos:

Procesos en primer plano (lo que el usuario est haciendo)


o

Actividades que han pasado por onResume

Servicios asociados

Servicios en primer plano

Callbacks de servicios

Mtodo onReceive de los BroadcastReceiver

Procesos visibles (an afecta a lo que el usuario ve en pantalla)


o

Actividades que no estn en primer plano pero an estn visibles


(onPause)

Un servicio que esta ligado a una actividad visible

Procesos de servicios (servicios en ejecucin que no estn en las otras


categoras)

Procesos en background (procesos que tienen una actividad que no es


visible actualmente al usuario)

Procesos vacos (no tienen ningn componente de la aplicacin,


normalmente de caching).

Por otro lado estn las hebras (Threads). Cuando la aplicacin es lanzada, el
sistema slo crea una hebra principal para la interfaz de usuario (UI Thread).
Pero, qu ocurrira cuando queramos hacer un trabajo intenso?
Estaremos bloqueando la hebra de la interfaz de usuario? La respuesta es
s, y es por eso que para trabajos intensos debemos crear nuestras propias
hebras.
Bsicamente, hay dos reglas bsicas:

No bloquear la hebra de la interfaz de usuario o principal


o

Si hiciramos esto, estaramos provocando el famoso error ANR


(App Not Responding), el cual aparece cuando bloqueamos la
interfaz grfica por unos 5 segundos aproximadamente. Es el error
ms molesto de Android, y como desarrolladores es posible evitarlo
siguiendo los consejos de Google.

No acceder a la interfaz grfica (Android UI Toolkit) desde fuera de la hebra


de la interfaz grfica. Para ello podemos hacer uso de:
o

Mtodo runOnUiThread(Runnable) de la clase Activity

Mtodo post(Runnable) de la clase View

Mtodo postDelayed(Runnable, long) de la clase View

Pero para simplificar an ms la posibilidad de realizar trabajos en segundo plano


e ir actualizando la interfaz grfica surge la clase AsyncTask, de modo que:

Te permite hacer trabajo asncrono en la interfaz grfica

Permite operaciones de bloqueo en una hebra secundaria

Publica los resultados en la interfaz grfica

Respecto al AsyncTask, hay que destacar que cuenta con:

Hebra secundaria
o

Mtodo doInBackground: Ser el que se ejecute en dicha hebra

Hebra principal o de la interfaz grfica. Los siguientes mtodos se


ejecutarn en dicha hebra:
o

Mtodo onPreExecute: Se ejecuta antes de que tenga lugar el


mtodo doInBackground

Mtodo onPogressUpdate: Se ejecuta cada vez que desde el


mtodo doInBackground queramos publicar el progreso con el
mtodo publishProgress

Mtodo onPostExecute: Se ejecuta al finalizar el


mtodo doInBackground

La comunicacin durante doInBackground:


o

El mtodo publishProgress se ejecutar desde la hebra secundaria,


para notificar a la hebra principal que debe llevar a cabo la accin
determinada en el mtodo onProgressUpdate

La comunicacin a lo largo del ciclo de vida se realiza a travs de


parmetros.

Para iniciar un AsyncTask bastar hacer uso de su constructor y llamar al


mtodo execute, .pasndole todos los parmetros que queramos:

Personalmente, como desarrollador de Android, creo que me costara vivir sin la


clase AsyncTask, pues la considero tan relevante como lo puede ser la clase
Activity.
Con todo esto, ya deberamos ser capaces de ejecutar cdigo en segundo plano,
algo que resulta vital para el buen desarrollo de una aplicacin, pues siempre
debemos dar la impresin de que la interfaz grfica est esperando el feedback
del usuario y no que est bloqueada por algn trabajo en cuestin.

Poco a poco, vamos teniendo las herramientas ms importantes para el


buen desarrollo de una app. Espero que os est resultando til.

13. Gestores de contenidos (Content Provider)


Un Content Provider administra acceso a un repositorio central de datos. Un
proveedor es parte de la aplicacin Android, la cual a menudo ofrece su propia
interfaz grfica para trabajar con datos. Sin embargo, los Content Providers son
pensados principalmente para ser usados por otras aplicaciones, que accedan al
proveedor por medio de un cliente.
Para acceder a los datos de un Content Provider usaremos un objeto cliente
ContentResolver. Este objeto nos proporciona mtodos para el bsico
CRUD (Create, retrieve, update, delete) del almacenamiento persistente de
datos. Acta como una capa de abstraccin entre su repositorio de datos y la
apariencia externa de los datos como tablas. Como siempre, para poder utilizarlo,
necesitamos asignar permisos en el Manifest.
Este sera un ejemplo de query:

Una Content URI es una URI que identifica datos en un proveedor. Incluye el
nombre simblico del proveedor completo (autoridad) y un nombre que apunta a
una tabla (path). Cuando llamamos a un mtodo del cliente, estos datos son uno
de los argumentos.

A partir de aqu, la gestin es bastante similar a como se hace en base de datos,


refirindome al concepto de queries, cursores Por tanto, tampoco vamos a
exterdernos mucho en este punto, sino tan slo comentar las cosas bsicas y
aportar los enlaces a ejemplos oficiales de cdigo.
Para solicitar datos a un proveedor, necesitaremos construir una query. Para
ver un ejemplo de una query simple, mi recomendacin es visitar este enlace.
Modificar datos ser similar, pudiendo ver ejemplos en el siguiente enlace.
Pero supongamos que no queremos crear nuestro propio Content Provider, sino
que queremos rescatar ciertos datos del telfono para usarlos en nuestra
aplicacin. Este es el caso del Calendar o los Contactos. Cada uno tendr su
propio proveedor, de forma que podremos disponer de esta informacin en
nuestra aplicacin, siempre y cuando le hayamos dado permisos en el Manifest.
En el caso del Calendar utilizaremos el Calendar Provider y en el caso de los
Contactos utilizaremos el Contacts Provider.
Con esto, podremos relacionar nuestras aplicaciones mediante los Content
Providers, as como utilizar datos externos a nuestra app como son los eventos
de Calendario o los Contactos.

14. La barra de acciones ActionBar

Cuando Google redise Android, incluyendo la interfaz Holo, entre otras cosas
trajo consigo el ActionBar. ste es una caracterstica de la ventana
que identifica la localizacin del usuario en la aplicacin y nos proporciona
tanto acciones posibles a realizar por el usuario, como modos de
navegacin. Podramos resumir sus funciones clave en las siguientes:

Proporcionar un espacio dedicado para la identidad de la aplicacin

Proporcionar un espacio dedicado para identificar dnde est el usuario


dentro de la aplicacin

Facilitar las acciones importantes de forma accesible y predictiva

Soportar navegacin consistente, especialmente en los cambios entre


diferentes vistas

Esta funcionalidad fue aadida para Android HoneyComb 3.0, pero qu


pasara si quisiramos poder utilizarla en una versin anterior de Android?
Simplemente tendremos que utilizar la librera de soporte, por ejemplo la
librera appcompat v7 support, en la cual nos basaremos para el resto del
artculo.
Para aadir el ActionBar, bastara extender nuestra actividad de la
claseActionBarActivity (de la librera de soporte) y utilizar uno de los
temasTheme.AppCompat como tema de nuestra actividad. En el caso de que no
necesitemos esa compatibilidad, podremos utilizar la clase Activity normal y usar
uno de los temasTheme.Holo.
Para eliminar el ActionBar, bastar llamar el mtodo hide:

Tambin podemos aadir elementos de accin, de forma que las acciones ms


importantes las veremos en todo momento en nuestro ActionBar, y las menos
importantes las podemos ocultar en el botn overflow (los famosos tres puntos).

Para aadir un men de acciones, deberemos seguir los siguientes pasos:


1. Crear el men en la carpeta res
2. Sobreescribir el mtodo onCreateOptionsMenu
3. Para decidir si queremos mostrar siempre o slo si hay espacio el elemento
de men, utilizaremos la propiedad showAsAction
4. Siempre tenemos que definir el ttulo (title) para cada elemento ya que:
o

Si no hay suficiente espacio, el elemento aparecer en el


desplegable del elemento overflow slo con el ttulo

Las pantallas optimizadas para invidentes leern dicho ttulo

Si slo vemos el icono, al hacer un click largo con el dedo, veremos


el texto

Una vez aadidos los elementos, basta con gestionar los eventos al hacer click
sobre cada elemento de men:

Adems, podremos hacer uso del Split ActionBar, que bsicamente consiste en
que si falta espacio se aada una segunda barra donde ya dispondremos de ms
espacio. Para ello tendremos que aadir la opcin uiOptions =
splitActionBarWhenNarrow a cada actividad declarada en nuestro Manifest o
directamente a la aplicacin entera. Pero hay que tener en cuenta que esta
opcin fue aadida en la API 14 de Android, y si queremos soportarlo en
versiones anteriores, deberemos aadir un <meta-data> como hijo de cada
actividad que declare dicho valor.

Otra cosa que podemos aadir en el ActionBar es que el icono de la izquierda (el
icono de la aplicacin) nos permita navegar a la pantalla justamente superior.
Para ello, deberemos llamar al mtodo setDisplayHomeAsUpEnabled. Otra
opcin es declarar en el Manifest para cada actividad cul ser su actividad padre
(slo disponible desde Android 16).

Ms cosas que podemos aadir y vemos en algunas aplicaciones son


los cuadros de dilogo de bsqueda. Para ello utilizaremos un ActionView.

Y podremos gestionar que se expanda y colapse dicha ActionView:

Tambin podemos aadir un Action Provider, como por ejemplo es el caso del
tpico botn que podemos ver para compartir:

Otro elemento tpico son las pestaas, para las cuales necesitaremos:
1. Implementar la interfaz ActionBar.TabListener
2. Instanciar ActionBar.Tab para cada pestaa y asignar el escuchador con el
mtodo setTabListener. Con setTitle y setIcon personalizaremos la pestaa.
3. Aadir cada pestaa al ActionBar a travs del mtodo addTab

Otro elemento que podemos aadir es una navegacin desplegable. Para ello:

1. Crearemos un SpinnerAdapter, el cual nos proporcionar la lista de


elementos de la lista desplegable.
2. Implementaremos ActionBar.OnNavigationListener para definir el
comportamiento que necesitamos para cada elemento
3. En el mtodo onCreate de nuestra actividad, habilitaremos la navegacin
desplegable llamando a setNavigationMode(NAVIGATION_MODE_LIST)
4. Asignaremos el callback para la lista con setListNavigationCallbacks

Como ltimo paso, deberemos personalizar la ActionBar a nuestro estilo y al de


nuestra aplicacin, mediante los estilos. Pero siempre os recomendar seguir
las guas de estilo de Android.
Si queres ver algunos ejemplos de cdigo, sigue las lecciones que Google nos
proporciona sobre ello aqu.
Y hasta aqu los conceptos de hoy.

15. Notificaciones
Una notificacin es un mensaje que podemos mostrar al usuario fuera de la
interfaz grfica normal de nuestra aplicacin. Para ello, Android cuenta con
una rea de notificacin. Adems, podremos ver detalles de las notificaciones

en el panel de notificaciones. Ambas definiciones estn siempre disponibles


para que el usuario pueda verlos.

Con la llegada adems de Android Wear, todo este sistema de notificaciones se


est convirtiendo en uno de los elementos centrales del sistema. Es por ello que
debemos analizar muy bien cundo mostrar notificaciones, por qu y con qu
contenido. Ya que es muy comn encontrar aplicaciones que resultan
muy pesadas a la hora de enviarnos notificaciones cada dos por tres, o
notificaciones que carecen de sentido.
Como recomendacin, os dir que una lectura indispensable al respecto es la
que podemos encontrar en el diseo de las notificaciones en la documentacin
oficial deAndroid.

Entrando ya de lleno en las notificaciones, podemos distinguir dos tipos de


vistas:

Vista normal: Aparece en el rea de arriba con una altura de 64dp.


Siempre ser mostrada esta vista hasta que expandamos una notificacin.
Contendr un ttulo (1), icono grande (2), texto (3), informacin (4), icono
pequeo (5) y hora de la notificacin (6).

Vista grande: Disponible desde Android 4.1, esta vista aparecer cuando
la notificacin es expandida. Tendr la misma informacin que la anterior,
ms una informacin adicional.

A continuacin, podemos ver un ejemplo de cmo crear una notificacin


bsica:

O cmo incluir una vista grande:

Pero todo este mundo de las notificaciones est cogiendo tal importancia, que
llega un punto donde gestionar de forma ptima las notificaciones es vital. Y en
esa gestin tambin debemos analizar cuntas notificaciones dar nuestra
aplicacin, con qu finalidad y si sern muchas, pocas, tiles
As que, por favor, analizad muy bien cuando queris mostrar una notificacin,
pues la mala eleccin de stas puede provocar incluso que un usuario desinstale
nuestra aplicacin.

16. Orientacin del dispositivo


Este concepto nos servir para dar valor aadido a nuestra aplicacin. Por qu?
Es sencillo: Tenemos que aprovechar al mximo la pantalla de la que
disponemos, por lo que para ello debemos tener en cuenta si nuestra informacin
ser mejor mostrada en portrait (vertical) o landscape (horizontal).
As, nos encontraremos multitud de aplicaciones que tienen fija la orientacin, da
igual como tengamos nosotros el dispositivo, por lo que nos obligarn a girarlo al

deseo del programador. En ciertas aplicaciones, como juegos, puede tener


sentido, pero no es a veces odioso no poder utilizar una aplicacin en la
orientacin que nos d la gana?
Es ms, no es genial que si estamos mostrando algn tipo de datos segn si
estemos en vertical u horizontal podamos ver una presentacin diferente de los
mismos? Eso es valor aadido, y eso es lo que diferencia una buena aplicacin
de otra aplicacin ms en el market.
Por ello, pensar en todo este tipo de detalles es lo que da calidad a nuestra
aplicacin, y la calidad es lo que produce luego un mayor nmero de descargas y
comentarios positivos.
Por eso aprovecho estas lneas para recomendar a todo aquel que va a
programar una aplicacin que dedique primero unas horas sin programar, a
pensar, a visualizar la aplicacin y lo que es ms importante: a darle todo el
valor aadido posible.
Ya slo quedan 2 semanas con 4 conceptos por delante. Ests al da en todos
ellos?
Penltimo captulo de esta seccin. Llegados este punto, ya hemos visto cmo
crear una aplicacin casi en su totalidad. Todos los puntos fuertes y necesarios
los hemos recorrido a lo largo de estas semanas. Con este captulo y el ltimo,
slo me queda dar informacin adicional y comentar aquellos puntos secundarios
que dan un valor aadido a nuestra aplicacin, pues en un mercado donde hay
tantas aplicaciones, lo ms importante es destacar a travs del valor aadido.

17. Animaciones
Lo primero de todo es darle vida a nuestra aplicacin. Para ello podremos animar
nuestras aplicaciones. Para ello, Android nos provee dos sistemas de
animaciones:

Animacin de propiedad (Introducido en Android 3.0 Honeycomb): Nos


permite animar las propiedades de cualquier objeto, incluyendo aquellas
que no son renderizadas en la pantalla. El sistema es extensible y nos
permite animar las propiedades de tipos personalizados por nosotros
mismos tambin.

Animacin de vista: Slo puede ser usada por objectos de la clase View.
Es relativamente fcil configurar y ofrecer animaciones en ellas y dar un
valor aadido a cada vista de nuestra pantalla.

Adems de estos dos sistemas, hay un tercero llamado Animacin de


Drawable, que nos permite cargar recursos de nuestra carpeta drawable y
mostrarlos de forma animada.
Pero pasemos a analizarlos un poco en ms profundidad estos sistemas.
Con las animaciones de propiedad, podremos definir las siguientes
caractersticas:

Duracin de la animacin (por defecto, 300ms)

Interpolacin de tiempo

Nmero de repeticiones y comportamiento

Sets de animadores

Retardo de refresco de capa

Para ver cmo funciona este sistema, veamos un ejemplo. A continuacin


podemos ver el ejemplo donde a un objeto le animamos su propiedad x, que
representa su posicin horizontal en la pantalla. La duracin de la animacin est
establecida en 40ms y la distancia en 40 pxeles. Cada 10ms, que es la tasa de
refresco por defecto, el objeto se mueve 10 pxeles horizontalmente. Tras 40ms,
la animacin para y el objeto acaba en la posicin final, 40 pxeles desplazado.
Es un ejemplo simple de interpolacin lineal(velocidad constante)

Tambin podemos tener interpolacin no lineal. En el siguiente ejemplo vemos


un caso similar pero con aceleracin al principio y deceleracin al final. El
resultado es el mismo que el anterior, pero el proceso diferente.

Las clases principales que entran en juego para todo este sistema son las
siguientes:

La clase ValueAnimator mantiene la informacin referente al tiempo,


encapsulando un TimeInterpolator, que define la interpolacin de la animacin y
un TypeEvaluator,que define cmo se calculan los valores que estn siendo
animados.
Para empezar una animacin, tendremos que crear un ValueAnimator y darle los
valores iniciales y finales a la propiedad a animar. Para ello, cuando llamamos al
mtodo start la animacin empezar. Durante toda la duracin de la animacin, el
objeto ValueAnimator creado calcular la fracin pasada entre 0 y 1, basado en la
duracin de la animacin y el tiempo ya transcurrido, con lo que tendremos el
tanto por uno de tiempo que la animacin ha completado. Cuando ste ha
calculado la fraccin transcurrida, llama al TimeInterpolator que calcula la fraccin
interpolada. Tras esto, el ValueAnimator llama a TypeEvaluator para calcular el
valor de la propiedad.
En las API Demos de Android, tenemos ejemplos sobre estas animaciones que
podemos ver tanto en cdigo como funcionando.
En lo que respecta a las animaciones de vista, podremos calcular
animaciones en base a la posicin, tamao, rotacin y transparencia de un
objeto de la clase View. Para ello, le definimos una serie de instrucciones en un
XML o programticamente, aunque es recomendable tenerlo en XML. Para ello,
utilizaremos las clases AnimationSet y Animation. Todo ello ir en los recursos
de nuestra aplicacin, en la carpeta anim.
A continuacin podemos ver un ejemplo:

Si el anterior cdigo lo tenemos guardado


en /res/anim/ como hyperspace_jump.xml, utilizarlo en una View de ejemplo sera
tan fcil como:
ImageView spaceshipImage = (ImageView)
findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this,
R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

Al igual que anteriormente, podemos determinar cmo se aplica la animacin


utilizando un Interpolator.
Como alternativa a startAnimation, podemos usar setStartTime/setAnimation.
Toda la informacin relativa a esto la podremos encontrar en los recursos de
animaciones.

18. Widgets
Si algo diferencia especialmente a Android del resto de plataformas, es el sistema
de Widgets que tiene implementado. Si echamos un ojo a nuestro telfono mvil,
veremos seguramente la cantidad de widgets que tenemos disponibles gracias a
las aplicaciones que tenemos instaladas.
Pero, qu es un widget? No es ms que una aplicacin en miniatura que
puede ser incluida en otras aplicaciones y recibir actualizaciones peridicas,
como por ejemplo la pantalla principal.

El mundo de los widgets es algo muy denso y que puede ser tan complejo como
nuestro widget queramos que sea. A pesar de ello, he de decir que, desde mi
punto de vista, los mejores widgets son aquellos muy simples pero con una
funcionalidad muy bien definida, y es que no debemos olvidar que un widgets es
para algo rpido e instantneo, no para meter toda la funcionalidad de una
aplicacin en una pantalla ms pequea.
Para crear un widget, necesitaremos a modo de resumen:

Un objeto AppWidgetProviderInfo, para incluir los metadatos del widget


(layout, frecuencia de actualizacin, clase AppWidgetProvider). Ser
definido en un XML.

Una implementacin de la clase AppWidgetProvider, para incluir los


mtodos bsicos que nos permitan, a travs de eventos broadcast,
gestionar el widget.

Un layout, definido en XML

Opcional: Una actividad de configuracin para el widget, la cual ser


lanzada cuando aadamos el widget en algn sitio, para configurar el
mismo widget con diferentes casos.

Para ello, tendremos que declarar nuestro widget en el Manifest (recordad, lo que
no est en el Manifest, no existe para Android):

Podis ver los ejemplos de Android, pero antes de ello mi recomendacin pasa
por leer todo lo referente al diseo de widgets, para no caer en errores que
puedan hacer de nuestro widget un quebradero de cabeza al usuario.

Con esto estaran todos los conceptos, y slo nos queda un artculo ms con
informacin adicional y conceptos menores a tener en cuenta.
Pero a pesar de que acabe esta seccin en una semana, seguiremos contando
cosas sobre programacin.
Hoy, sin embargo, me dispongo a escribir los conceptos 19 y 20. Se tratan
bsicamente de dos puntos con enlaces de referencia y sitios de inters, pues los
conceptos importantes en s ya los hemos ido viendo a lo largo de las semanas.
Y con esto, llegarn las ltimas palabras bajo esta seccin.

19. Otros conceptos


Si bien es cierto que en esta seccin, con 20 conceptos no podemos ser unos
expertos en Android, creo que s nos aporta una base bastante slida como para
tratar cualquier concepto que no hubiramos visto antes. Con dicha base, y la
documentacin oficial de Android que nos proporciona Google, deberamos ser
capaces de llevar a cabo casi cualquier funcionalidad (tcnicamente hablando).
Por ejemplo, es cierto que no hemos hablado hasta ahora de cmo utilizar
la cmara de fotos o vdeo en Android. Pero, si por ejemplo queremos desde
nuestra aplicacin poder coger una foto con la cmara o de nuestra galera, os
suena si os digo que basta con lanzar un Intent (concepto 7)?
Ya hemos hablado anteriormente por ejemplo de los Contactos, pero
bsicamente sabiendo gestionar Content Provider (concepto 13) sabremos
gestionar los contactos.
Adems de la cmara, disponemos de sensores en nuestros dispositivos,
como el giroscopio o el acelermetro. Para ello, simplemente gestionaremos
los Servicios (concepto 11) que se comunican con ellos y sobreescribiremos
mtodos que se disparan con determinados eventos. Os suena tambin?

Referente a la localizacin, podremos gestionarlo tanto con el


posicionamiento con ahorro de batera o el GPS. Para ello, seguiremos
utilizando Servicios que se comunicarn con nuestra aplicacon. Adems,
podremos utilizar los servicios de Google Maps para disponer de mapas en
nuestra aplicacin, calcular rutas, etctera S, es cierto que habra echar un
vistazo a la API de Google Maps para Android, pero conforme la miris os
daris cuenta que todo os resulta familiar. Acaso no os podis imaginar qu son
las clases MapFragment, MapActivity o MapView?
Otras cosas que podemos utilizar es incluir una web especfica dentro de una
parte de nuestra aplicacin. Volvemos a lo mismo, sabrais utilizar un
WebView?
Pues igual que con estos conceptos, sucede con todos los dems.
Y la pregunta del milln: por qu un concepto de Otros conceptos? La
respuesta es muy simple. Con la base sobre Android ya en la cabeza, utilizar
cualquier concepto es simplemente leer un poco la documentacin y ponerse
manos a la obra. Por eso en este concepto mi nica intencin es haceros ver
que sin conocerlo todo sobre Android, la base es suficientemente buena
como para abordar cualquier problema sin impedimentos.

20. Informacin adicional

Y este es el concepto que nunca quiere uno que llegue: el ltimo. Y por eso
mismo, aqu no pretendo explicar nada nuevo, pues como ya hemos comentado
la base ya est. Simplemente incluiremos una lista de enlaces de inters que nos
servirn de gran ayuda en diferentes fases del desarrollo de nuestra aplicacin, a
modo de resumen de toda la seccin.
En primer lugar, siempre est bien tener un glosario con los trminos ms
importantes de Android, simplemente para refrescarnos la memoria.

Tambin est bien tener una gua sobre recomendaciones a seguir de la mano
de la mismsima gran G.
Pero siempre teniendo presente una cosa: nuestra particular biblia para
programar Android es y debe ser siempre su documentacin oficial.
Aparte de eso, siempre deberemos tener presente que hay que posicionar
nuestra aplicacin dndole calidad y elegancia. Para ello, tenemos la gua de
diseo de Android.
Y si ya tenemos lista nuestra aplicacin para ser publicada, es momento de
distribuirla y ver cmo podemos llegar a ganar dinero (si es lo que pretendemos),
monetizando nuestra aplicacin. Y dnde estar la mejor informacin al
respecto? Efectivamente, en la gua de distribucin de aplicaciones de
Android hecha por Google.
Una vez hecho esto, slo nos queda esperar a los usuarios, su feedback y
mejorar la aplicacin. Aadir funcionalidad nueva. Pero tambin promocionarla. Y
para ello tendremos herramientas que podemos utilizar, como puede ser
el Device Art Generator, una web donde podremos incrustar pantallazos de
nuestra aplicacin en un marco de un dispositivo determinado, quedando
totalmente profesional.
Para todo lo dems, Googlear!
Con esto termina esta seccin que esperamos os haya gustado mucho y
resultado de utilidad. No obstante, seguiremos publicando nuevos artculos sobre
programacin, as que estad atentos!

You might also like