domingo, 15 de septiembre de 2013

El archivo AndroidManifest.xml

En el tutorial anterior la estructura de directorios que tiene un proyecto Android. Y comentamos la importancia de dichos directorios y de los archivos que incluyen. Vamos a presentar el archivo más importante de cada proyecto y que deberá de estar presente en la raíz del proyecto: AndroidManifest.xml.
Dicho archivo es generado automáticamente y modificable gráficamente o  programando. Y por lo tanto es importante conocerlo. Ya que el archivo presenta información esencial sobre la aplicación al sistema operativo Android. Información necesaria para que pueda ejecutar la aplicación.

Principales tareas que realiza AndroidManifest.xml:

- Utiliza el nombre de paquete Java como identificador único de la aplicación.
- Describe los componentes de la aplicación: Actividades, servicios, proveedores de contenido... Para ello utiliza el nombre de las clases que implementan cada uno de estos componentes y publica sus capacidades. Esto permite al sistema operativo conocer que componentes tiene y bajo que condiciones pueden ser lanzados.
- Especifica que permisos tiene la aplicación para acceder a partes protegidas del API que proporciona el sistema Android.
- Declara la mínima versión del sistema operativo en el que funcionará la aplicación.
- Indica las librerías que utiliza el proyecto y por lo tanto tienen que ser empaquetadas al crear la aplicación.
- Permite declarar  una clase 'Instrumentation' que sirve para monitorizar la interacción de la aplicación con el sistema. Esta declaración solo estará presente mientras se desarrolla y prueba la aplicación. Ya que será borrada antes de que la aplicación se vaya a publicar.

Partes de AndroidManifest.xml

Vamos a mostrar un ejemplo básico de 'manifiesto' y vamos a explicar cada una de sus partes:

 <?xml version="1.0" encoding="utf-8"?>  
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
   package="com.loginandregisterapi"  
   android:versionCode="1"  
   android:versionName="1.0" >  
   <uses-sdk  
     android:minSdkVersion="10"  
     android:targetSdkVersion="17" />  
   <uses-permission android:name="android.permission.INTERNET"/>  
   <application  
     android:allowBackup="true"  
     android:icon="@drawable/ic_launcher"  
     android:label="@string/app_name"  
     android:theme="@style/AppTheme" >  
     <activity  
       android:name="com.example.loginandregisterapi.LoginActivity"  
       android:label="@string/app_name" >  
       <intent-filter>  
         <action android:name="android.intent.action.MAIN" />  
         <category android:name="android.intent.category.LAUNCHER" />  
       </intent-filter>  
     </activity>  
   </application>  
 </manifest>  

Cosas a tener en cuenta:

- El elemento padre (manifest) del archivo debe de contener una declaración del espacio de nombres y del nombre que asigna al paquete que forma la aplicación.
- Cada manifiesto incluye un único elemento que contendrá información básica para la aplicación como el icono, nombre o tema que utiliza.
- Cada una de las actividades (controladores de cada pantalla de la interfaz) que aparecerán en la aplicación deberán de aparecer en el manifiesto.

Descripción de los  elementos básicos:

1. Etiqueta manifest

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
   package="com.loginandregisterapi"  
   android:versionCode="1"  
   android:versionName="1.0" >  

Este el elemento raíz del manifiesto y sus dos atributos principales y obligatorios son:
- xmlns:android: Define el espacio de nombres de Android y siempre debe de ser el mismo
- package: El nombre del paquete define la aplicación y actúa como identificador único de la misma. Por lo que si has publicado una aplicación con un nombre y luego se cambia, los usuarios de la primera versión no podrán actualizar a la siguiente.

2. Etiqueta uses-sdk

   <uses-sdk  
     android:minSdkVersion="10"  
     android:targetSdkVersion="17" />   

Elemento (etiqueta) de segundo nivel obligatorio que determina la compatibilidad de la aplicación con una o más versiones del sistema operativo. Esta compatibilidad viene expresada en base al nivel de API del sistema Android que soporta. Sus dos atributos principales son:
- android:minSdkVersion (obligatorio): Determina el mínimo nivel de API que debe de tener el sistema operativo Android que pretenda ejecutar la aplicación. El sistema evitará que la aplicación se instale en un sistema que tenga un nivel de API inferior del especificado.
- android:targetSdkVersion (opcional): Si no se especifica se toma el valor de minSdkVersion. Determina el nivel del API con el que fue construida la aplicación. Por lo que se espera que tome ventajas del nivel de API especificado pero es totalmente retro-compatible con versiones antiguas hasta la indicada mediante minSdkVersion.

3. Etiqueta uses-permission

   <uses-permission android:name="android.permission.INTERNET"/>  

Etiqueta opcional de segundo nivel que sirve para indicar un permiso necesario que requiere la aplicación para acceder a alguna parte protegida del API que proporciona el sistema Android. Esta declaración alertará a los usuarios que la aplicación utilizará ciertos permisos. Evidentemente crearemos tantas etiquetas como permisos necesitemos. El único atributo disponible y obligatorio es android:name. El cual indica un permiso que necesita la aplicación.

Para ver la lista total de permisos podemos recurrir a la documentación de Google.
http://developer.android.com/reference/android/Manifest.permission.html

4. Etiqueta application

   <application  
     android:allowBackup="true"  
     android:icon="@drawable/ic_launcher"  
     android:label="@string/app_name"  
     android:theme="@style/AppTheme" >  

Etiqueta de segundo nivel que contendrá otras etiquetas que declararán cada uno de los componentes de la aplicación. Además permite atributos que pueden afectar a todos los citados componentes de la aplicación. Solo se puede declarar una vez este elemento en el manifiesto. Y admite multitud de atributos aunque los más importantes y utilizados son los siguientes:
- android:allowBackup(opcional). Valor por defecto a true. Indica que si se hace un backup del sistema Android, las aplicaciones que tengan este valor a true se guarden junto con el backup del sistema.
- android:description: Descripción larga de la aplicación y sus funcionalidades.
- android:icon: identificador del recurso que será el icono de la aplicación. Como se comento en el anterior tutorial, los recursos crearán un identificador en la clase R para facilitar sus acceso en el código fuente de la aplicación.
- android:label. Identificador de la cadena de texto que dará nombre a la aplicación y que será el que verá el usuario en el sistema operativo.
- android:permission. Especificamos el nombre de un permiso que será necesario si otras aplicaciones hacen uso de partes de tu aplicación. También podemos definir el permiso necesario  para cada una de las actividades (siguiente etiqueta) utilizando este atributo en cada una de ella.
- android:theme. Identificador al recurso que especifica el tema por defecto de todas las actividades de la aplicación. Las actividades pueden sobreescribir individualmente el tema general con sus respectivos atributos android:theme.

5. Etiqueta activity

     <activity  
       android:name="com.example.loginandregisterapi.LoginActivity"  
       android:label="@string/app_name" >  
     </activity>  

Etiqueta de tercer nivel y que es uno de los sub-elementos de la etiqueta application. Una actividad es el controlador que va a interactuar con una pantalla de la interfaz gráfica. Y por lo tanto debemos de especificar cada actividad del proyecto con su etiqueta activity correspondiente. Si una actividad no esta especificada en el manifiesto, esta no podrá lanzarse. Con el consiguiente error en la aplicación.
Principales atributos:
- android:ExcludeForRecents(opcional). Si su valor es 'true' significa que la aplicación asociada con esta actividad no aparecerá en la lista de aplicaciones recientes del sistema Android,
- android:exported (opcional). Con este atributo podemos restringir a que esta actividad pueda ser lanzada por componentes de otra aplicación.Con lo que limitamos la exposición a otras aplicaciones. Por lo tanto si el valor es 'true' aceptamos dicho uso.
- android:icon (opcional). Si se desea que  el icono que aparece junto a la etiqueta superior de la pantalla de la interfaz gráfica sea distinto al icono general de la aplicación, se puede especificar con el identificar del recurso de tipo imagen que se desea.
- android:label (obligatiorio). Etiqueta que verá el usuario en la parte superior (junto al icono) cuando la actividad muestre la pantalla gráfica correspondiente. El valor será una referencia a un identificar de recurso de tipo cadena.
- android:name (obligatorio). Este atributo indica el nombre de la clase (ruta completa) que implementa la actividad.
- android:screenOrientation (opcional). Con este atributo indicamos que orientación tendrá la pantalla de la interfaz gráfica que controla nuestra actividad. sus valores más usados son 'portrait' (vertical), 'landscape' (horizontal) o el valor por defecto 'unspecified' con el que el dispositivo elige la orientación.

6. Etiqueta intent-filter

     <activity  
       android:name="com.example.loginandregisterapi.LoginActivity"  
       android:label="@string/app_name" >  
       <intent-filter>  
         <action android:name="android.intent.action.MAIN" />  
         <category android:name="android.intent.category.LAUNCHER" />  
       </intent-filter>  
     </activity>  

Etiqueta que se sitúa como sub-elemento de la anterior etiqueta (activity). Esta etiqueta sirve para agrupar el número de acciones que concretarán el ámbito en el que se va a ejecutar la actividad. Las actividades pueden declarar el tipo de acciones que pueden llevar a cabo y los tipos de datos que pueden gestionar.
Si una actividad no tiene declarado ningún 'intent filter', se considera una opción para cualquier 'intent' con una acción. Por lo tanto es importante definir que acciones puede manejar la actividad.
Hay que tener en cuenta que solo es necesario declarar filtros cuanto los 'intents' son lanzados de forma implícita. Ya que es el sistema Android el encargado de buscar la actividad adecuada. En los 'intents' lanzados de forma explicita ya se especifica la actividad que se quiere ejecutar.

7. Etiqueta action


     <activity  
       android:name="com.example.loginandregisterapi.LoginActivity"  
       android:label="@string/app_name" >  
       <intent-filter>  
         <action android:name="android.intent.action.MAIN" />  
         <category android:name="android.intent.category.LAUNCHER" />  
       </intent-filter>  
     </activity>  

Una acción que el 'intent-filter' soporta. Las acciones son cadenas de texto estándar que describen lo que que la actividad puede hacer. El único y obligatorio atributo es android:name. En el cual indicaremos el nombre de la acción. En el anterior ejemplo, indicamos que esta es la actividad principal de la aplicación y por lo tanto la que controlará el inicio de la aplicación.

Pero imaginemos que nuestra actividad especifica las siguientes acciones:

 <intent-filter>  
      <action android:name="android.intent.action.VIEW" />  
      <action android:name="android.intent.action.EDIT" />  
      <category android:name="android.intent.category.DEFAULT" />  
      <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />  
 </intent-filter>  

Esto nos indica que la actividad está disponible para ver y editar elementos del tipo vnd.android.cursor.dir/vnd.google.note

Lista de acciones estándar:
http://developer.android.com/reference/android/content/Intent.html

8. Etiqueta category

Básicamente indica si la actividad va a ser lanzada desde el lanzador de aplicaciones, desde el menú de otra aplicación, directamente desde otra actividad...

Lista de categorías:
http://developer.android.com/reference/android/content/Intent.html

9. Etiqueta data

Mediante esta etiqueta añadiremos una especificación de datos para las acciones especificadas. Puede ser un tipo de datos o una URI.


Otras etiquetas como reveicer, service o provider se verán cuando avancemos en dichos conceptos.


Entradas relacionadas

Conceptos básicos de Android

9 comentarios:

  1. Excelente explicaciòn se te agradece, puedo recomendar este curso de android http://www.grupocodesi.com/cursos/curso-de-android.html es muy profesional

    ResponderEliminar
  2. Con q aplicación, puedo cambiar o editar el archivo AndroidManifest.xml? Muchas gracias

    ResponderEliminar
  3. Con q aplicación, puedo cambiar o editar el archivo AndroidManifest.xml? Muchas gracias

    ResponderEliminar
  4. Sigo sin entender en que parte de mi cel entro para modificar el manifest

    ResponderEliminar
  5. Muy buena explicación, una definición bastante completa.
    Muchas gracias por compartir.



    android tv box comprar

    ResponderEliminar
  6. Me gustaría saber que línea debo editar para Hacer que mi apk se ejecute en fondo,como lo hace la apk de mensajes, ella espera que llegue el sms y se abre sola.sin pincharla,gracias y Mucha salud para todos ustedes.

    ResponderEliminar