Tutorial Che cos’è l’ AndroidManifest.xml?

0
2201

Nell’ articolo di oggi parleremo di un file molto importante il AndroidManifest.xml, è colui che definisce i contenuti e il comportamento della nostra applicazione.

Vi consigliamo prima di leggere gli articoli precedenti per chi non l’avesse già fatto.

Che cos’è il file AndroidManifest.xml ?

Ogni progetto Android include un AndroidManifest.xml memorizzato nella directory principale del progetto: in questo file XML si possono inserire nodi per ogni elemento (Activity, Service, Content Provider e così via) che compone la nostra applicazione, impostando i permessi per determinare come questi interagiscono l’un l’altro e con le altre applicazioni.

Tra i principali permessi che possiamo richiedere ci sono i seguenti:

  • READ_CONTACTS: leggere (ma non scrivere) i dati dei contatti dell’utente.
  • WRITE_CONTACTS: scrivere (ma non leggere) i dati dei contatti dell’utente
  • RECEIVE_SMS: monitorare l’arrivo di messaggi SMS
  • INTERNET: accedere ed utilizzare la connessione Internet
  • ACCESS_FINE_LOCATION: utilizzare un accurato sistema di localizzazione come il GPS

Ecco un Esempio di un file AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="it.quickgo.helloword"
 android:versionCode="1"
 android:versionName="1.0" >
<uses-sdk
 android:minSdkVersion="8"
 android:targetSdkVersion="22" />
<application
 android:allowBackup="true"
 android:icon="@drawable/ic_launcher"
 android:label="@string/app_name"
 android:theme="@style/AppTheme" >
 <activity
 android:name=".MainActivity"
 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>

 

Come possiamo vedere si tratta di un documento XML avente come root l’elemento manifest cui viene associato come default il namespace relativo allo schema http://schemas.android.com/apk/res/android che ne definisce la semantica.

Alcune delle informazioni inserite in fase di creazione del progetto le ritroviamo come valori degli attributi dell’elemento manifest e di altri, che descriveremo di volta in volta quando studieremo i componenti che li andranno a utilizzare.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="it.quickgo.helloword"
 android:versionCode="1"
 android:versionName="1.0" >

 

Gli attributi android:versionCode e android:versionName, che vedremo meglio più avanti, permettono di assegnare alla stessa un numero di versione da utilizzare in fase di aggiornamento.
Quindi android:versionCode verrà utilizzato per il riconoscimento delle versioni mentre android:versionName sarà quello visualizzato all’utente.

Notiamo poi la presenza dell’elemento application, che descrive appunto le caratteristiche della nostra applicazione.

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

 

L’attributo utilizzato in questo caso si chiama android:label e il valore corrispondente sarà proprio quello utilizzato come nome dell’applicazione nella home.
Nell’esempio non vi è scritto HelloAndroid, ma esiste una notazione del tipo @string/app_name che permette di fare riferimento a una risorsa di nome app_name di tipo string.

Quindi all’interno del file di configurazione della nostra applicazione esista un meccanismo per fare riferimento a determinate risorse.
Per comprendere il caso specifico basterà visualizzare il contenuto del file strings.xml nella directory res/values del nostro progetto, ovvero:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">"HelloWord "</string>
 <string name="hello_world">Hello world!</string>
 <string name="action_settings">Settings</string>
</resources>

 

Se torniamo a vedere il file sorgente della classe R generata automaticamente in fase di build notiamo inoltre la presenza della costante R.string.app_name.

Come mai usiamo @string e non @strings (nome del file) ?

Perché ciò che interessa ad Android non è il nome del file ma il fatto che all’interno dello stesso vi siano degli elementi string.
Anche se definissimo due file distinti contenenti però elementi string associati a chiavi diverse la classe interna generata sarebbe comunque una sola, di nome string.

Un’applicazione può essere composta da più schermate, ciascuna delle quali descritta da quella che abbiamo imparato a chiamare activity e che vedremo meglio nei prossimi articoli.

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

 

In questo caso, android:name e android:label descrivono rispettivamente il nome della classe associata all’attività relativamente al package dell’applicazione e la label da visualizzare come titolo.
Per quest’ultima possiamo poi utilizzare la stessa sintassi usata per l’accesso alle risorse dell’applicazione (strings.xml).

L’ultima informazione che vogliamo dare al dispositivo riguarda la modalità con cui l’Activity dovrà essere visualizzata, e ciò viene espresso attraverso l’elemento intent-filter.

 

I concetti di intent filter e di intent stanno alla base di tutta l’architettura di Android in modo molto leggero possiamo pensare ad un intent come la volontà, da parte di un componente, di eseguire una particolare azione su un determinato insieme di dati (analizzeremo meglio nei prossimi articoli).

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

Un intent filter è invece la dichiarazione da parte di un componente (in questo caso una Activity) di essere in grado di soddisfare a un intent.

Ecco che, per esempio, se un componente avesse la necessità di visualizzare l’elenco dei contatti della rubrica per sceglierne uno, basterà che lo stesso lanci il corrispondente intent;

esso verrà raccolto da uno dei componenti che, al momento della  installazione, hanno dichiarato, attraverso un elemento intent filter, di essere in grado di gestirlo.

Nel caso specifico, attraverso gli elementi action e category abbiamo indicato che la nostra Activity sarà candidata a soddisfare l’intent corrispondente all’azione MAIN della categoria LAUNCHER.

Questo, in pratica, equivale a dire che l’attività sarà una di quelle disponibili nella home eseguibile attraverso la selezione della corrispondente icona.

Come detto, approfondiremo nel dettaglio i concetti di intent e intent filter insieme ad altri fondamentali nell’architettura di Android.

In questo caso abbiamo solamente voluto sottolineare come il file di configurazione AndroidManifest.xml sia fondamentale per fornire al dispositivo la descrizione dell’applicazione e dei relativi componenti.

Ovviamente questo file conterrà diversi altri tipi di informazioni, che andremo a esaminare e che descriveranno diverse tipologie di componenti caratterizzanti un’applicazione per Android.