Il progetto approntato nel capitolo precedente con l'aiuto dell'IDE può essere ora analizzato nel dettaglio. Lo scopo che ci prefiggiamo è quello di osservare da vicino come è fatta un'Activity, il primo dei quattro componenti basilari che troviamo nelle applicazioni Android.
Nel nostro progetto ce n'è una ed è l'interfaccia utente che mostra il messaggio “Hello World”. Nonostante la sua semplicità, mette in luce un aspetto fondamentale. Per creare un'Activity è necessario fare due cose:
- estendere la classe Activity o una da essa derivata, appartenente al framework Android;
- registrare l'Activity nell'AndroidManifest.xml mediante l'uso dell'apposito tag XML <activity>. Tra l'altro, questo dettame vale per tutte le quattro componenti fondamentali di un'applicazione.
L'Activity nel codice Java
Il codice Java che realizza l'Activity risiede nella cartella src, come spiegato in precedenza. Il contenuto di un tipico “Hello world” potrebbe essere questo:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
La classe si chiama MainActivity
ed estende AppCompatActivity
. Al suo interno viene implementato l'override del metodo onCreate
. Per il momento, ci accontentiamo di sapere che questo metodo viene invocato alla creazione dell'Activity. Più avanti scopriremo che si tratta di una tappa fondamentale del ciclo di vita di questo tipo di componenti.
A proposito delle due righe di codice presenti all'interno dell'onCreate:
super.onCreate(savedInstanceState)
: invoca il metodo omonimo della classe base. Questa operazione è assolutamente obbligatoria;setContentView(R.layout.activity_main)
: specifica quale sarà il “volto” dell'Activity, il suo layout. Al momento la dicitura R.layout.activity_main può apparire alquanto misteriosa ma lo sarà ancora per poco, fino al momento in cui verrà illustrato l'uso delle risorse. Il suo effetto è quello di imporre come struttura grafica dell'Activity il contenuto del file activity_main.xml presente nella cartella res/layout.
L'Activity nel file Manifest
Il file AndroidManifest.xml che configura questa applicazione appare così:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="it.html.helloworld">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Il nodo <application> contiene le componenti usate nell'applicazione. In questo caso, c'è un nodo <activity> che con l'attributo android:name specifica il nome della classe Java che incarna l'Activity. Se, come in questo caso, non viene specificato un package è sottintesa l'appartenenza della classe al package riportato nel nodo <manifest>, la root del file.
Il costrutto intent-filter all'interno serve ad indicare che questa activity è la main activity del progetto, in pratica l'interfaccia che accoglierà l'utente all'ingresso nell'applicazione.
E se volessimo altre activity? È possibile averne? Certamente.
L'importante è che ogni activity venga prodotta seguendo i due passi definiti all'inizio di questa sezione: (1) creare una classe Java che estenda Activity e (2) definire un nodo <activity> in AndroidManifest.xml che riporti nell'attributo android:name il nome della classe corrispondente. A proposito di questo, il sottonodo intent-filter riferito all'action MAIN va indicato solo nell'Activity principale del progetto.
L'utente passerà da un'activity all'altra in maniera simile a come è abituato a fare tra le pagine dei siti Internet ma qui il tutto avverrà mediante il potente meccanismo degli Intent spiegato a breve.