Ahora que ya lo tenemos todo instalado lo siguiente seria saber que es lo que sucede cuando creamos un nuevo proyecto, como ya hemos visto una vez que creamos el proyecto se nos crea una serie de carpetas y ficheros esenciales para la ejecución de cualquier proyecto, el fichero que nos ocupa hoy es el AndroidManifest.xml el principal fichero para la creación de cualquier proyecto, sea del tamaño que sea.
El fichero se encuentra en la raíz de cualquier proyecto. Dentro de
AndroidManifest.xml podemos declarar todo lo que pueda suceder en nuestra aplicación, tales como las actividades, los servicios y demás, y la manera en que interactúan entre ellos y con el sistema. En este podríamos indicar que actividad es la que aparecerá en el menú principal del dispositivo, también conocido como "launcher".
Cuando creamos el proyecto se nos genera automáticamente el AndroidManifest.xml con la estructura básica para un programa básico; con la declaración de una actividad y nada más. Según aumente la dificultad de nuestro programa el AndroidManifest.xml aumentara de lineas de código y por ende aumentara en declaraciones.
La estructura de este fichero esta basado en el XML v1.0 y lo tenemos que encapsular en UTF-8. El elemento raíz de todo los archivos es, obviamente, un elemento "manifest"
<manifest android:versioncode="1" android:versionname="1.0" package="lfr.liem.dazkun.test.android.helloandroid" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-sdk android:minsdkversion="4"> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:label="@string/app_name" android:name=".HelloAndroidActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"> <category android:name="android.intent.category.LAUNCHER"> </category></action></intent-filter> </activity> </application> </uses-sdk></manifest>
Uno de los datos más importantes que debemos indicar en la declaración del manifiesto es el del atributo "package" el cual corresponde al espacio de nombres que definimos en el momento de la creación del proyecto. En el código que ya realizamos anteriormente tenemos que el package es "lfr.liem.dazkun.test.android.helloandroid", el cual indica el nombre del paquete Java que contiene el elemento raíz de nuestra aplicación, o lo que es lo mismo, la actividad principal de arranque que necesitamos para que inicie siempre antes que las demás.
Posteriormente pasaremos a declarar cada una de las actividades, para ello deberemos seguir una convención de nombres, la convención consiste en poner el nombre de la clase Java que representa la "Activity" y anteponerle un punto al nombre. Por ejemplo, en nuestro caso la actividad que necesitamos ejecutar es "liem.dazkun.test.android.helloandroid.HelloAndroidActivity.java" y por ello en el tag "activity" tendríamos que poner el android:name como ".HelloAndroidActivity" quedando de la siguiente manera.
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:label="@string/app_name" android:name=".HelloAndroidActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"> <category android:name="android.intent.category.LAUNCHER"> </category></action></intent-filter> </activity> </application>
Esto sucede de esta manera por que en la parte de "package" ya hemos puesto como root la parte principal "lfr.liem.dazkun.test.android.helloandroid" prácticamente se podría decir que el package + el activity te tiene que dar la ruta completa del paquete que se va a ejecutar..
Dentro del AndroidManifest.xml se pueden implementar también permisos, dispositivos y aplicaciones para ello existen los siguientes elementos que se pueden implementar en el AndroidManifest.xml.
Dentro del AndroidManifest.xml se pueden implementar también permisos, dispositivos y aplicaciones para ello existen los siguientes elementos que se pueden implementar en el AndroidManifest.xml.
- uses-permission: Con este elemento se pueden declarar los permisos que necesitará nuestra aplicación para funcionar correctamente. Para ello podemos encontrar permisos para acceder al GPS del teléfono así como a los datos de localización para realizar las funciones.
- permission: Este elemento declara los permisos que las actividades o servicios necesitan para poder mantener el correcto uso de los datos de la aplicación y ya de paso mantener la lógica de la misma.
- instrumentation: Con este elemento lo que buscaremos es la declaración del código que deberá ser invocado cuando un evento clave del sistema sea llamado por el usuario, tales como el arranque de una actividad como podría ser el logueo o monitoreo.
- application: Esta es la piedra angular de todo nuestro proyecto en el definiremos las entrañas de nuestro programa (nombre, actividad principal, icono, etc.) que el archivo AndroidManifest.xml describe.
Existen una estructura mucho más amplia que se puede implementar, aunque estos son los básicos. La lista completa seria la siguiente.
Aparte cada uno de los tags puede contener sus propios parámetros e incluso contener algún nivel más, por ejemplo el tag "Action" solo contiene un parámetro, android:name, pero si miramos el tag "Activity" tendriamos todos estos parametros.
<manifest> <uses-permission> <permission> <permission-tree> <permission-group> <instrumentation> <uses-sdk> <uses-configuration> <uses-feature> <supports-screens> <compatible-screens> <supports-gl-texture> <application> <activity> <intent-filter> <action> <category> <data> </data></category></action></intent-filter> <meta-data> </meta-data></activity> <activity-alias> <intent-filter> . . . </intent-filter> <meta-data> </meta-data></activity-alias> <service> <intent-filter> . . . </intent-filter> <meta-data> </meta-data></service> <receiver> <intent-filter> . . . </intent-filter> <meta-data> </meta-data></receiver> <provider> <grant-uri-permission> <meta-data> </meta-data></grant-uri-permission></provider> <uses-library> </uses-library></application> </supports-gl-texture></compatible-screens></supports-screens></uses-feature></uses-configuration></uses-sdk></instrumentation></permission-group></permission-tree></permission></uses-permission></manifest>
Aparte cada uno de los tags puede contener sus propios parámetros e incluso contener algún nivel más, por ejemplo el tag "Action" solo contiene un parámetro, android:name, pero si miramos el tag "Activity" tendriamos todos estos parametros.
<activity android:allowTaskReparenting=["true" | "false"] android:alwaysRetainTaskState=["true" | "false"] android:clearTaskOnLaunch=["true" | "false"] android:configChanges=["mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navigation", "screenLayout", "fontScale", "uiMode", "orientation", "screenSize", "smallestScreenSize"] android:enabled=["true" | "false"] android:excludeFromRecents=["true" | "false"] android:exported=["true" | "false"] android:finishOnTaskLaunch=["true" | "false"] android:hardwareAccelerated=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:launchMode=["multiple" | "singleTop" | "singleTask" | "singleInstance"] android:multiprocess=["true" | "false"] android:name="string" android:noHistory=["true" | "false"] android:permission="string" android:process="string" android:screenOrientation=["unspecified" | "user" | "behind" | "landscape" | "portrait" | "reverseLandscape" | "reversePortrait" | "sensorLandscape" | "sensorPortrait" | "sensor" | "fullSensor" | "nosensor"] android:stateNotNeeded=["true" | "false"] android:taskAffinity="string" android:theme="resource or theme" android:uiOptions=["none" | "splitActionBarWhenNarrow"] android:windowSoftInputMode=["stateUnspecified", "stateUnchanged", "stateHidden", "stateAlwaysHidden", "stateVisible", "stateAlwaysVisible", "adjustUnspecified", "adjustResize", "adjustPan"] > </activity>
Pero esto es algo que veremos poco a poco, la verdad es que es mucha información en demasiado poco tiempo. Tened en cuenta que a traves de este fichero se tiene que codificar desde un simple popup, hasta un programa que se alimente de un webservice e imprima de manera remota en una impresora wifi.