sábado, 30 de agosto de 2014

Componentes de una aplicación

Los componentes son la esencia en la construcción de una aplicación Android. Cada componente puede comportarse como un punto de entrada en nuestra aplicación. No todos los componentes serán puntos de entrada, algunos dependerán de otros, pero cada uno de ellos juegan su propio papel y en conjunto definirán el comportamiento de nuestra aplicación.
Hay cuatro tipos de componentes. Cada tipo sirve para un propósito diferente y cuenta con su propio ciclo de vida que define cómo el componente será creado y destruido:
  • Actividades. Una actividad representa una pantalla de la interfaz de usuario. Por ejemplo, una aplicación que gestione nuestro correo electrónico debería contar con una actividad que muestre la lista de los mensajes de correo recibidos, otra actividad para poder crear un nuevo mensaje de correo, y otra actividad para poder leer los mensajes de correo. Aunque las actividades trabajan en sintonía para conseguir una aplicación de correo electrónico en su conjunto, cada una de ellas es independiente de las otras. Tal es así que otra aplicación podría iniciar cualquiera de esas actividades (si nuestra aplicación de correo electrónico lo permitiera). Por ejemplo, una aplicación que utilizase la cámara de fotos, podría usar la actividad para crear un mensaje de correo y permitir que el usuario pudiera compartir una foto.
Una actividad es una subclase de Activity.
  • Servicios. Se trata de un componente que se ejecuta en segundo plano para realizar una tarea que tardará más de lo habitual o que realiza trabajos para procesos remotos. Un servicio no cuenta con una interfaz de usuario. Por ejemplo, un servicio podría reproducir música en segundo plano mientras el usuario interactúa con alguna otra aplicación del sistema, o por ejemplo, mientras se están obteniendo datos a través de la red en segundo plano, el usuario se encuentra interactuando con alguna actividad. Otros componentes, como puede ser una actividad, pueden iniciar el servicio permitiendo su ejecución o pueden enlazarlo para interactuar con él.
Un servicio es una subclase de Service.
  • Proveedores de contenido. Gestiona y comparte datos de aplicación. Puedes almacenar datos en el sistema de archivos, en una base de datos SQLite, en el Web, o en cualquier otro sitio que permita persistencia de datos y al que tu aplicación tenga acceso. A través de un proveedor de contenido, otras aplicaciones podrán acceder y modificar los datos que provee. Por ejemplo, Android proporciona un proveedor de contenido para la gestión de los contactos del usuario. Una aplicación con los permisos adecuados podría consultar o modificar la información relacionada con una persona determinada.
Los proveedores de contenido también son útiles a la hora de gestionar los datos no compartidos, de uso interno, de tu aplicación.
Un proveedor de contenido es una subclase de ContentProvider
  • Receptores de avisos. Un receptor de avisos es un componente que responde a un amplio conjunto de avisos que el sistema genera: el sistema nos avisa de que la pantalla del dispositivo se ha apagado o el sistema nos avisa de que la batería se encuentra baja de carga, etc. Es importante observar que el origen del mensaje es único, mientras que los receptores del mensaje pueden ser muchos. Por otro lado, una aplicación puede también enviar avisos a los receptores de avisos. Por ejemplo, una aplicación que quiere comunicar que un archivo se acaba de descargar y que ya está disponible para su uso.
Aunque los receptores de avisos no cuentan con una interfaz de usuario, podrían crear algún tipo de notificación del sistema para comunicar cuando suceden determinados eventos, o podrían iniciar un determinado servicio ante dichos eventos.
Un receptor de avisos es una subclase de BroadcastReceiver. Cada aviso se entrega al receptor como un Intent.

Una de las cosas que hacen a Android único, es la posibilidad de que cualquier aplicación pueda iniciar un componente de otra aplicación. Por ejemplo, si quieres hacer una fotografía con la cámara, seguramente exista ya otra aplicación que cuente con esta funcionalidad y puedas reutilizarla sin verte en la necesidad de tener que implementar tu propia cámara. Para ello, simplemente inicias la actividad para tomar la fotografía, tomas la fotografía y usas la fotografía devuelta para usarla en tu aplicación. Para el usuario este proceso es transparente y creerá que la cámara es parte de tu aplicación.

Es importante destacar que cuando el sistema ejecuta un componente de otra aplicación, éste se ejecutará en su propio proceso y éste será distinto al proceso desde el que originó la llamada. A diferencia de otros sistemas, las aplicaciones de Android no cuentan con un único punto de entrada (no hay una función main() por ejemplo).

Debido a que cada aplicación se ejecuta en su propio proceso y con un sistema de archivos cuyo acceso está restringido a la propia aplicación, ésta no podrá iniciar un componente externo. Es el propio sistema Android el que puede hacerlo. Para ello, se tendrá que entregar un mensaje al sistema donde se especifica la intención de iniciar un componente concreto y ajeno. El sistema hará de intermediario para iniciar dicho componente.

Activar componentes.

Actividades, servicios y receptores de avisos son activados por mensajes asíncronos llamados intenciones (intents). Las intenciones enlazan unos componentes con otros en tiempo de ejecución, independientemente de si el componente pertenece a la misma aplicación o a otra distinta. Puedes pensar en ellos como mensajeros que solicitan una acción a un componente desde otros componentes.

Una intención es una instancia de la clase Intent que define un mensaje para activar un componente específico (intención explícita) o un tipo de componente (intención implícita).

Para las actividades y servicios, una intención debe definir una acción a realizar (por ejemplo, la acción de visualizar o enviar algo) y puede especificar un enlace (URI) a los datos sobre los que actuar. Por ejemplo, una intención puede solicitar a una actividad que visualice una imagen o abrir una página web. Además, puedes iniciar una actividad a la espera de un resultado. En este último caso, la actividad receptora de la intención también devuelve el resultado en una nueva intención. Por ejemplo, puedes crear una intención para que el usuario seleccione un contacto de la agenda y éste sea devuelto en una intención que incluya un enlace al contacto seleccionado.

Para los receptores de avisos, las intenciones sólo incluyen el mensaje de aviso. Por ejemplo, para indicar que el dispositivo tiene la batería baja de carga, la intención incluye una cadena asociada al evento "batería baja". Estas cadenas de acción, las tendremos disponibles como constantes en nuestro entorno de programación (Intent.ACTION_BATTERY_LOW).

Un proveedor de contenido no es usado a través de intenciones. En su lugar, se utilizará a través de un resolutor de contenidos (ContentResolver).  El resolutor de contenidos gestiona todas las operaciones con el proveedor de contenidos liberando al componente de su uso directo. En su lugar, el componente utilizará la interfaz definida en le resolutor de contenidos. Esto nos deja una capa de abstracción entre el proveedor de contenidos y el componente que consulta sus contenidos (por razones de seguridad).

Utilizaremos los siguientes métodos para activar cada tipo de componente:
  • Podemos iniciar una actividad (o darle una tarea a realizar) pasando como parámetro una intención (Intent) a los métodos startActivity() o startActivityForResult() (cuando quieras que la actividad receptora devuelva un resultado).
  • Podemos iniciar un servicio (o dar nuevas instrucciones a un servicio ya iniciado) pasando como parámetro una intención (Intent)  al método startService(). O podemos enlazar con un servicio utilizando el método bindService().
  • Podemos comunicar un aviso a todos los receptores del mismo indicando una intención como argumento de los métodos sendOrderedBroadcast() o sendStickyBroadcast().
  • Podemos consultar los datos de un proveedor de contenidos (ContentProvider) haciendo uso del método query() de un resolutor de contenidos (ContentResolver).

No hay comentarios:

Publicar un comentario