sábado, 30 de agosto de 2014

El archivo AndroidManifest.xml

Puesto que el sistema Android es el intermediario de atender las intenciones cada vez que se pretende activar un componente, éste debe saber de la existencia de dichos componentes. Es aquí cuando el archivo especial AndroidManifest.xml entra en juego. Nuestra aplicación tendrá que declarar todos sus componentes en este archivo que se encuentra ubicado en el directorio raíz de nuestro proyecto (generalmente /app/src/main/AndroidManifest.xml).

Este archivo sirve, además, para otros propósitos tales como:
  • Identificar los permisos que nuestra aplicación requiere por parte del usuario. Como por ejemplo, tener acceso a Internet o poder consultar la agenda de contactos.
  • Declarar la versión mínima de API que nuestra aplicación necesita para funcionar.
  • Declarar características software y hardware que nuestra aplicación necesitará para funcionar. Por ejemplo, cámara, bluetooth o pantalla multi táctil.
  • Librerías enlazadas y necesarias para un correcto funcionamiento. Por ejemplo, la librería de mapas de Google.
  • Y más ...

Nota. En Android Studio, el punto segundo y cuarto de la lista anterior, se configura desde el archivo /app/build.gradle.

Declarando componentes.

El propósito principal del archivo de declaraciones de Android es el de informar al sistema de los componentes que conforman nuestra aplicación. Por ejemplo, se puede declarar una actividad de la siguiente manera:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:icon="@drawable/app_icon.png" ... >
        <activity android:name="com.example.project.ExampleActivity"
                  android:label="@string/example_label" ... >
        </activity>
        ...
    </application>
</manifest>

El atributo android:icon del elemento <application> hace referencia al icono asociado a la aplicación.

El elemento <activity> sirve para declarar una actividad. El atributo android:name hace referencia al nombre de la clase de nuestra actividad. El atributo android:label será el título que identificará a nuestra actividad cuando ésta se visualice.

Cada tipo de componente dispone de su propio elemento XML en el archivo de declaraciones:
  • <activity> para declarar actividades.
  • <service> para declarar servicios.
  • <receiver> para declarar receptores de avisos.
  • <provider> para declarar proveedores de contenido.

Las actividades, servicios y proveedores de contenido que quieras utilizar deberán estar declarados previamente en este archivo. No obstante, en lo que respecta a los receptores de avisos, éstos podrán ser declarados en el archivo de declaraciones, o bien, podrán ser creados dinámicamente a través de código: primero creando una instancia de la clase BroadCastReceiver y posteriormente registrándola en el sistema invocando el método registerReceiver().

Declarando otros atributos de un componente.

Como ya sabemos, la activación de un componente se hace a través del envío de un mensaje asíncrono llamado intención. Puedes usar una intención para interactuar con actividades, servicios y receptores de avisos. Puedes hacerlo especificando de manera explícita un componente (usando su nombre de clase) en la intención. No obstante, el verdadero poder de las intenciones radica en el concepto de intención implícita. Una intención implícita simplemente describe el tipo de acción a realizar (y, opcionalmente, los datos sobre los que quieres realizar dicha acción) y deja en manos del sistema la responsabilidad de encontrar un componente adecuado para realizar la acción especificada. Si durante el proceso de búsqueda, el sistema localiza a varios candidatos que cumplen con dicha acción, se permitirá al usuario que elija su opción predilecta.

La manera en la que el sistema identifica a los componentes que pueden responder a una intención determinada, es a través de los filtros de intenciones definidos en el archivo de declaraciones de Android.

Cuando declaras una actividad en el archivo de declaraciones de Android, opcionalmente puedes declarar los filtros de intenciones para los que la actividad deberá responder. Para añadir un filtro de intenciones tendrás que añadir un elemento <intent-filter> como nodo descendiente del elemento componente.

Por ejemplo, si hacemos una aplicación para gestionar el correo electrónico y dentro de ésta, creamos una actividad que sirva para dar de alta nuevos correos, podríamos declarar un filtro de intenciones que responda a intenciones que lleven consigo el mensaje de acción "enviar" (send):
<manifest ... >
    ...
    <application ... >
        <activity android:name="com.example.project.ComposeEmailActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <data android:type="*/*" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>
De esta manera si una aplicación envía una intención implícita con la cadena de acción Intent.ACTION_SEND asociada, el sistema iniciará tu actividad por defecto si se tratara de la única actividad que es capaz de responder a este tipo de intención (tal y como hemos definido en el elemento <intent-filter>). Si existiesen más actividades candidatas en el sistema que fuesen capaces de responder dicha intención, nuestra actividad, simplemente, aparecería disponible para que el usuario pudiera seleccionarla junto al resto actividades.

Declarando los requerimientos de nuestra aplicación.

Existen multitud de dispositivos Android y no todos ellos cuentan con las mismas características y prestaciones. Para prevenir que nuestra aplicación sea instalada en un dispositivo que no cumpla con los requisitos mínimos, es importante definir con claridad en el archivo de declaraciones de Android qué dispositivos y qué requerimientos software son necesarios para una correcta ejecución. La mayoría de esta información no será utilizada por el sistema pero si por servicios externos como la tienda Google Play que los usará para facilitar la búsquedas de sus usuarios en busca de aplicaciones compatibles.

Por ejemplo, si nuestra aplicación require de la cámara y usa APIs de la versión 2.1 de Android (versión 7 de la API), deberíamos declarar estos requerimientos de la siguiente manera:
<manifest ... >
    <uses-feature android:name="android.hardware.camera.any"
                  android:required="true" />
    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
    ...
</manifest>
Ahora, los dispositivos que no tienen cámara y tienen una versión de Android inferior a la 2.1, no podrán instalar nuestra aplicación desde Google Play.

No obstante, podemos declarar que nuestra aplicación necesita de cámara, pero que no es obligatorio que el dispositivo cuente con ella para instalar la aplicación. En este caso, especificaremos valor false para el atributo android:required y será en tiempo de ejecución cuando comprobaremos si el dispositivo cuenta con una cámara o no.

No hay comentarios:

Publicar un comentario