DevCorner

DevCorner: le basi dello sviluppo, Activity ed Intent

Giuseppe Tripodi -

Puntuale come un orologio sulla home (quelli svizzeri hanno fatto il loro tempo), torna DevCorner e, come promesso la settimana scorsa, questa volta è il momento di un po’ di sana teoria sulle basi della programmazione Android.

Partiamo quindi da uno dei concetti fondamentali, necessari da capire per comprendere come funziona un’applicazione: l’Activity (o Attività).

Cos’è un’Activity?

Ogni volta che usiamo un’applicazione, soprattutto su versioni di Android come Gingerbread e precedenti, possiamo notare facilmente dei cambiamenti di schermata: ad ognuna di queste “finestre” corrisponde verosimilmente un’Activity (un discorso a parte meriterebbero i Fragment, che non mancheremo di spiegarvi a tempo debito): ognuna di quelle interfacce rappresenta una porzione di applicazione ben precisa che può eseguire determinate operazioni e può interagire con l’utente tramite diverse componenti di input (ovviamente il touch, ma anche eventuali tasti hardware).
Solitamente le Activity utilizzano componenti grafiche già definite (campi di testo, bottoni, visualizzatori di immagini…), ma questa non è necessariamente la regola (gli sviluppatori di giochi, ad esempio, sono spesso costretti a rinunciare a questa comodità).

Il ciclo di vita delle Activity

Per sua natura, il sistema operativo Android può avere una ed una sola Activity in esecuzione (foreground): questo vuol dire, ad esempio, che quando la nostra app è attiva, persino il launcher è momentaneamente stoppato.
Se ci troviamo con un software che esegue delle operazioni in background (come un riproduttore musicale, ad esempio), sapremo quindi che per farlo non sta usando un’Activity ma altro che approfondiremo a tempo debito (un Service, un Broadcast Receiver…).

Tutte le Activity hanno un ciclo di vita, ossia una serie di status in cui possono trovarsi, che vanno dal lancio alla distruzione della stessa; la variazione di stato dipende da quello che facciamo (ad esempio, ritornare alla Home manderà l’applicazione in Stop) e, ogni volta che il software cambia di stato, richiama dei metodi che servono, generalmente, a ricostruire l’interfaccia grafica e a richiamare eventuali dati salvati.

Per capire meglio il ciclo di vita delle Activity, siamo sicuri che un’immagine vi chiarirà le idee:

activity_lifecycle

Particolarmente importanti, tra tutti, sono i metodi onCreate(), onResume() e onRestart(), che vengono spesso integrati per far eseguire all’applicazione determinate operazioni ogni volta che questa viene avviata o ripristinata, ma che possono portare facilmente a crash se gestiti in maniera impropria.

Gli Intent

Come avrete capito, ogni “pagina” di un’applicazione è una diversa Activity: ma come si passa da un’attività ad un’altra? Per rispondere a questa domanda, prima di terminare questa spiegazione, dobbiamo quindi introdurre il concetto di Intent, che rappresenta, tra le altre cose, la disposizione  di un software di “cambiare schermata”.

Per comprendere meglio quanto detto finora, andiamo a creare una semplicissima app con due Activity, che andremo a commentare.

Hello (Android)World

Avviamo Eclipse (se non l’avete installato, qui abbiamo spiegato come scaricare la versione preconfezionata da Google per la programmazione Android) o qualsiasi altro IDE utilizzato e creiamo un nuvo progetto Android:  File, New, Android Application Project.

Inseriamo come nome HelloAndroidWorld e lasciamo tutto il resto come si trova: per la semplicità e lo scopo didattico dell’applicazione, non è necessario modificare nulla, proseguite solo Avanti per terminare la configurazione iniziale.

L’app avrà quindi la solita Activity di default, con del testo che recita “Hello world!”: apriamo il file activity_main.xml (presente nella cartella res/layout), che definisce l’interfaccia grafica e aggiungiamo un bottone per cambiare activity: possiamo farlo semplicemente trascinando l’elemento Button dalla finestra From Widgets, oppure inserirlo “a mano” dal codice xml: l’importante, alla fine, è avere un risultato del genere (visualizzabile cliccando in basso su activity_main.xml, affiancato da Graphical Layout):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:tools="http://schemas.android.com/tools"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   android:paddingBottom="@dimen/activity_vertical_margin"

   android:paddingLeft="@dimen/activity_horizontal_margin"

   android:paddingRight="@dimen/activity_horizontal_margin"

   android:paddingTop="@dimen/activity_vertical_margin"

   tools:context=".MainActivity" >

   <TextView

       android:id="@+id/textView1"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="@string/hello_world" />

   <Button

       android:id="@+id/bottone"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:layout_centerHorizontal="true"

       android:layout_centerVertical="true"

       android:text="Cambia Activity" />

</RelativeLayout>

Il rigo android:text vi darà un avvertimento: spiegheremo nel prossimo articolo come lavorare con le risorse per evitare warning simili.
Molto importante, invece, è inserire:

android:onClick="cambia"

che andrà a richiamare il metodo per cambiare l’activity.

Creiamo, quindi, una seconda Activity: è possibile farlo molto facilmente, cliccando su File, New, Other…, Android Activity. Lasciamo come impostazione Blank e come nome, alla voce Activity Name, inseriamo Second Activity: il wizard si occuperà di modificare gli altri parametri conformemente, non ci resta quindi che cliccare direttamente su Finish.

Nell’xml di questa Attività, modifichiamo il testo inserendo il nostro fascinoso Hello (Android)World!, avendo un risultato simile:

 

 

Ignoriamo anche questa volta il warning relativo alla penultima riga e, per completare il nostro piccolo tutorial, andiamo a modificare il codice java della prima activity, in modo da inserire un Intent che le consenta di passare a questa seconda appena creata.

Apriamo quindi il file MainActivity.java, che si trova all’interno di src/nomedelpacchetto e, in fondo al file, prima della parentesi graffa finale, creiamo un nostro metodo per cambiare Attività tramite un Intent:

    public void cambia (View view){

        Intent cambioActivity;

        cambioActivity = new Intent (this, SecondActivity.class);

        startActivity(cambioActivity);

Spiegando brevemente tutto ciò che riguarda questo semplicissimo metodo:
public indica che questa operazione è richiamabile da tutti (essendo pubblica), void indica che non restituisce nulla di riutilizzabile (come del testo, un numero…) e cambia è il nome (che, come ricorderete, abbiamo inserito anche nell’xml della nostra MainActivity).

Per quanto riguarda il (View view), per adesso prendetelo per buono senza troppe pretese di capire: in generale, sappiate che quello che viene scritto tra parentesi è qualcosa che il metodo può utilizzare (un numero, un oggetto…): quando non c’è nulla da passare, si è soliti inserire una generica View di nome view.

Passiamo all’interno delle parentesi: il primo rigo, indica che stiamo dichiarando un nuovo oggetto di tipo Intent chiamato cambioActivity; proseguendo, andiamo a definire com’è composto questo Intent: è un nuovo Intent che prende come Activity di partenza quella in cui ci troviamo (this) e come Activity a cui puntare la nostra SecondActivity.class.
Infine, è necessario avviare questo processo, utilizzando il nostro Intent appena creato con il metodo nativo di Android startActivity, al quale passeremo tra parentesi il nome del nostro oggetto appena creato.
Prima di terminare, probabilmente noterete che ci saranno degli errori, segnalati da delle x rosse al lato di alcune parti di codice: sono dovuti al fatto che non abbiamo ancora importato alcune librerie: cliccando Ctrl+Shift+O, l’importazione dovrebbe avvenire automaticamente, in caso contrario accertiamoci di avere quanto segue all’inizio del codice:

   
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;

Il risultato finale di tutto quanto scritto, dovrebbe essere qualcosa di simile:

package com.example.helloandroidworld;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.Menu;

import android.view.View;

public class MainActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

    }

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.main, menu);

        return true;

    }

    public void cambia (View view){

        Intent cambioActivity;

        cambioActivity = new Intent (this, SecondActivity.class);

        startActivity(cambioActivity);

    }

}

Se tutto è corretto, non dovreste ricevere errori: dopo aver abilitato il debug USB dallo smartphone, potete quindi inviare l’applicazione al telefono per testarla , tramite l’apposito tasto verde a forma di Play e scegliendo Android Application come  opzione: avrete una vostra applicazione composta da due schermate come queste di seguito.

MainActivity

SecondActivity

 

 

 

 

 

 

 

 

 

 

Prima di concludere questo primissimo tutorial sulle basi della programmazione, siamo costretti a specificare che potrebbero esserci centinaia di diversi  motivi che potrebbero causare errori: per questo motivo, nell’apposita sezione del forum saremo felici di rispondere a tutti i vostri dubbi e a tentare di risolvere eventuali problemi.

Sperando che questa guida sia stata esaustiva e di vostro gradimento, vi invitiamo a darci i vostri feedback e vi diamo appuntamento alla prossima settimana!