Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 11 di 97
  • livello avanzato
Indice lezioni

Intent e messaggi

Impariamo in che modo i componenti di un'app mobile Android dialogano fra loro per gestire le richieste degli utenti: gli intent.
Impariamo in che modo i componenti di un'app mobile Android dialogano fra loro per gestire le richieste degli utenti: gli intent.
Link copiato negli appunti

Quando si è parlato delle componenti che rappresentano i blocchi costitutivi di un'app, si è accennato al ruolo degli Intent. Approfondendo il discorso possiamo dire che rappresentano una forma di messaggistica gestita dal sistema operativo con cui una componente può richiedere l'esecuzione di un'azione da parte di un'altra componente.

Sono uno strumento molto duttile anche se gli utilizzi più comuni ricadono  in queste tre casistiche:

  1. avviare un'Activity;
  2. avviare un Service;
  3. inviare un messaggio in broadcast che può essere ricevuto da ogni applicazione.

Inoltre, gli Intent possono essere:

  • espliciti: viene dichiarato quale componente dovrà essere attivata. Particolarmente utili nell'apertura di una nuova Activity, li vedremo al lavoro nel corso di questa lezione;
  • impliciti: non specificano una componente da attivare ma quale azione deve essere svolta. La loro invocazione si estrinseca spesso nell'apertura di una finestra di dialogo che chiede all'utente quale app vuole si apra per completare l'azione.

Gli Extras

Un altro aspetto molto utile degli Intent è che essi, nel recapitare questo messaggio, hanno a disposizione una specie di “bagagliaio”, in cui custodiscono dati che possono essere letti dal destinatario. Questi valori condivisi mediante Intent vengono generalmente chiamati Extras e possono essere di varie tipologie, sia appartenenti a classi più comuni che ad altre purchè serializzabili. La gestione degli Extras negli Intent funziona in maniera simile ad una struttura dati a mappa: con dei metodi put viene inserito un valore etichettato con una chiave e con i corrispondenti metodi get viene prelevato il valore, richiedendolo mediante la chiave di riconoscimento.

L'esempio: un form di login

Prendiamo a titolo di esempio il caso più comune, solitamente utilizzato presto dal programmatore Android neofita, l'attivazione di un'Activity da parte di un'altra. Osserviamo quanto appare in figura:

Abbiamo due activity:

  • MainActivity contiene un semplice form di login. Dopo aver inserito username e password viene controllata la validità dei dati ed in caso positivo viene invocata l'apertura di un'altra activtiy;
  • SecretActivity è l'area accessibile solo mediante login e contiene – immaginiamo – dati riservati.

All'ingresso della seconda Activity, l'applicazione vuole dare il benvenuto all'utente ma per farlo ha bisogno di sapere come si chiama.

Tutto ciò che serve è già incluso nel meccanismo degli Intent.

A livello di codice, nella MainActivity, una volta ottenuto il successo nel login troveremo:

Intent i=new Intent(this,SecretActivity.class);
i.putExtra("username", account_username);
startActivity(i);

Le tre operazioni rappresentano:

  • dichiarazione dell'Intent come normale oggetto Java. In questo caso avremo un cosiddetto intent esplicito in quanto appare chiaramente il nome della classe che verrà invocata;
  • viene inserito, tra gli Extras, una String, la variabile account_username, che sarà trasportata con l'Intent fino a destinazione ossia la classe SecretActivity. Lo scopo è inserire in questa stringa il nome dell'utente che ha effettuato il login. Notare che l'extra viene etichettato con una chiave, in questo caso “username”. Ciò perchè possono essere trasportati più Extras per ogni Intent e dovrà essere possibile distinguerli per utilizzarli;
  • infine il metodo startActivity dimostra quale azione vogliamo attivare con questo Intent, si tratta, in questo caso, dell'avvio di un'Activity.

Nel metodo onCreate della seconda Activity, quella con il contenuto riservato, troveremo le seguenti righe:

Intent i=getIntent();
String username=i.getStringExtra("username");

Notiamo subito che l'Activity attivata si trova a disposizione, mediante getIntent(),  l'Intent che ne ha provocato l'attivazione. Lo può utilizzare per recuperare la stringa passata, contenente il nome utente.

A livello di ciclo di vita, che succede?

Il passaggio da un'Activity ad un'altra coinvolge i cicli di vita di entrambe. La prima, quella messa a  riposo, dovrà passare almeno per onPause (cessazione interazione con l'utente) e onStop (activity non più visibile) mentre la seconda percorrerà la catena di creazione onCreate-onStart-onResume.

Ma in che ordine avverrà tutto ciò? La priorità del sistema è il mantenimento della fluidità della user-experience. Per questo la consecutio delle operazioni sarà:

  • la prima Activity passa per onPause e viene fermata in stato Paused;
  • la seconda Activity va in Running venendo attivata completamente. In tale maniera l'utente potrà usarla al più presto non subendo tempi di ritardo;
  • a questo punto, mentre l'utente sta già usando la seconda Activity, il sistema può invocare onStop sulla prima.

Ti consigliamo anche