Activity e ciclo di vita in applicazione Android

Una activity è il componente fondamentale attraverso il quale una applicazione interagisce con l’utente. Può a tutti gli effetti essere paragonata ad una form dei linguaggi tradizionali (visual basic) o ad una semplice pagina html visualizzata da un browser.

android-activity-lifetime-602x486

In questa guida ci concentreremo sulle Activity e sulciclo di vita di un’applicazione Android, concetti fondamentali se volete intraprendere la strada della programmazione android.

Cos’è un Activity?

Stando alla documentazione ufficiale, un’attività è “una singola e precisa cosa che l’utente può fare”. Proviamo ad indagare le implicazioni di questa affermazione. Partiamo dal fatto che l’utente, per fare qualcosa, deve interagire con il dispositivo. Domandiamoci come avvenga, nel caso di uno smartphone, l’interazione tra l’uomo e la macchina. Un ruolo essenziale, naturalmente, è svolto dai meccanismi di input come la tastiera ed il touchscreen, che permettono all’utente di specificare il proprio volere. Le periferiche di input, tuttavia, da sole non bastano. Affinché l’utente sappia cosa può fare e come debba farlo, ma anche affinché il software possa mostrare all’utente il risultato elaborato, è necessario un canale aggiuntivo. Nella maggior parte dei casi questo canale è il display. Nella superficie dello schermo il software disegna tutti quegli oggetti con cui l’utente può interagire (bottoni, menù, campi di testo), e sempre sullo schermo viene presentato il risultato dell’elaborazione richiesta. Il ragionamento ci porta alla conclusione che, per fare qualcosa con il dispositivo, è necessario usare lo schermo. Esiste perciò un parallelo tra il concetto di attività, in Android, e quello di finestra, in un sistema desktop, benché non siano esattamente la stessa cosa.

Riassumendo:  Un’activity è in parole povere una finestra che contiene l’interfaccia dell’applicazione.

Un’applicazione può avere una o più activity. Lo scopo principale di un’activity è gestire l’interazione tra l’utente e l’applicazione. Dal momento in cui lanciamo l’applicazione fino al momento in cui la mandiamo in background, l’activity passa attraverso varie fasi, da qui il ciclo di vita di un’app android. Capire il ciclo di vita di un’activity è fondamentale per assicurare un corretto funzionamento della vostra applicazione.

Quando creaiamo un progetto android, Eclipse crea automaticamente per noi l’activity:

import android.app.Activity;

import android.os.Bundle;
import android.util.Log;

public class HelloWorldActivity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 }

}

Come vedete la nostra classe HelloWorldActivity estende la super classe Activity ed il metodo onCreate si occupa di implementare l’interfaccia della classe padre, caricando la UI definita nel nostro fileres/layout/main.xml (in realtà potete chiamarlo come vi pare) attraverso l’istruzionesetContentView(R.layout.main); .

Il ciclo di vita

In un sistema desktop il monitor è sufficientemente spazioso da poter mostrare più finestre simultaneamente. Perciò non è affatto raro lavorare con più programmi contemporaneamente attivi,  le cui finestre vengono affiancate o sovrapposte. Gli smartphone, invece, funzionano diversamente.

La super classe Activity definisce una serie di eventi che governano il ciclo di vita di un’activity. Spetta poi alle classi che estendono da Activity implementarli. Questi eventi sono:

  • onCreate() — chiamato quando l’activity viene lanciata per la prima volta
  • onStart() — chiamato quando l’activity diventa visibile all’utente
  • onResume() — chiamato quando l’activity inizia ad interagire con l’utente
  • onPause() — chiamato quando l’attuale activity viene messa in pausa e un’activity precedente viene ripristinata
  • onStop() — chiamato quando l’activity non è più visibile all’utente
  • onDestroy() — chiamato prima che l’activity venga distrutta (manualmente o dal sistema operativo per liberare memoria)
  • onRestart() — chiamato dopo che l’activity era stata stoppata e quando è pronta ad essere ripristinata

La prassi richiede che, come prima riga di codice di ciascuno di questi metodi, si richiami  l’implementazione di base del metodo che si sta ridefinendo. Ad esempio:

@Override
protected void onStart() {
super.onStart();
// proprio codice a seguire
} 

È importante non dimenticarlo.

Ecco lo schema direttamente dalla documentazione ufficiale:

activity_lifecycle

Proviamo a capire il ciclo di vita di un’activity con un esercizio. Caricate Eclipse e create un nuovo progetto chiamato HelloWorldActivity, proprio come fatto nella precedente guida. La versione dell’applicazione android non è importante ai fini di questo esercizio.

Aprite il file HelloWorldActivity.java e aggiungete:


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class HelloWorldActivity extends Activity {
 /** Called when the activity is first created. */
 String tag = "CicloDiVita";
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 Log.d(tag, "Ciclo di vita completo in onCreate");
 }

public void onStart(){
 super.onStart();
 Log.d(tag, "Ciclo di vita visible in onStart");
 }

public void onStop(){
 super.onStart();
 Log.d(tag, "Ciclo di vita visible in onStop");
 }

public void onPause(){
 super.onStart();
 Log.d(tag, "Ciclo di vita invisible in onPause");
 }

public void onResume(){
 super.onStart();
 Log.d(tag, "Ciclo di vita invisible in onResume");
 }

public void onDestroy(){
 super.onStart();
 Log.d(tag, "Ciclo di vita completo in onDestroy");
 }
}

Adesso andiamo ad aprire l’emulatore per provare l’applicazione. Se non l’avete già fatto dovete creare un nuovo emulatore. Aprite l’Android virtual device manager (passo 1 nell’immagine qui sotto), si aprirà una finestra con tutti i virtual device che avete creato. Cliccate su new (passo 2) per aprire il creatore di virtual device, quindi mettete un nome per il virtual device ed una versione di android (la stessa dell’applicazione che state creando), quindi create il virtual device (passo 3 e 4).

create-avd

Adesso che avete creato il vostro virtual device andiamo sulla finestra package explorer (sulla sinistra, dove c’è l’albero dei file del progetto), cliccate con il tasto destro sul nome dell’applicazione e selezionate run as->android application.

Inizierà a caricarsi il virtual device che avete creato. Ci metterà più o meno tempo in caricare  a seconda della potenza del vostro computer, ma comunque mettetevi l’anima in pace perchè ci sono da aspettare minimo 5 minuti.

Finito di caricare dovreste avere sullo schermo la vostra applicazione helloWorld (se non ce l’avete fatela partire di nuovo senza chiudere l’emulatore). Adesso tornate su eclipse ed aprite il DDMS (window->open perspective->DDMS). Siete ora nell’ambiente per impartire direttive all’emulatore (esempio simulare una chiamata) e per vedere i messaggi del log.

L’applicazione che avete appena creato genera dei messaggi nel log quando entra nelle varie fasi del ciclo di vita.  Provate a premere il tasto back sull’emulatore e tornate sul DDMS. Nel log dovreste vedere qualcosa del tipo :

Ciclo di vita visible in onStop
Ciclo di vita completo in onDestroy

Premendo il tasto back l’activity è entrata rispettivamente nel metodo onStop() e onDestroy() che contengono le istruzioni per generare una nuova entrata nel log ( Log.d(tag, “Ciclo di vita visible in onStop”); ). Premendo il tasto home invece dovrebbe uscire qualcosa del tipo:

Ciclo di vita invisible in onPause
Ciclo di vita visible in onStop

Provate a vedere cosa succede se, aprendo una differente app, tornate alla vostra activity tenendo premuto il tasto home.

Conclusioni

Conoscere e comprendere il ciclo di vita di un’applicazione è fondamentale se volete assicurare un corretto funzionamento della vostra applicazione. Android è un sistema operativo multi tasking, l’utente, oltre ad usare la vostra app, userà altre 20 app contemporaneamente passando di una in una. Quindi è necessario implementare un sistema per salvare lo stato dell’applicazione ogni volta che viene messa in background e recuperarlo ogni volta che viene ripristinata l’activity.

Abbiamo concluso. Alla prossima.