Sistemi Mobili e Wireless Android Activity Stefano Burigat Dipartimento di Matematica e Informatica Università di Udine www.dimi.uniud.it/burigat stefano.burigat@uniud.it
Activity Tipicamente, un'activity corrisponde ad una singola schermata visuale con la quale l'utente può interagire Le activity sono entità separate le une dalle altre, anche se fanno parte della stessa applicazione Tipicamente, esiste un'activity principale che viene visualizzata all'utente all'avvio di un'applicazione Il passaggio da un'activity ad un'altra avviene attraverso il meccanismo degli intent 2
Activity e ciclo di vita Ogni tipo di componente in Android ha un diverso ciclo di vita che definisce come il componente viene creato e distrutto Lo sviluppatore viene informato dal sistema Android sui diversi stati in cui si trova un'applicazione e può agire di conseguenza 3
Activity e ciclo di vita Le activity in un sistema Android vengono gestite come uno stack Quando viene fatta partire una nuova activity, questa viene posizionata in cima allo stack e diventa l'activity in esecuzione L'activity precedente non ritornerà attiva fino alla chiusura dell'activity in esecuzione Se l'utente preme il tasto Back sul dispositivo, l'activity corrente viene chiusa e l'activity precedente nello stack diventa attiva 4
Activity e ciclo di vita 5
Activity e ciclo di vita Un'activity può trovarsi essenzialmente in tre stati: running: l'activity è in foreground, in cima allo stack ed ha il focus (l'utente può interagirci) paused: l'activity ha perso il focus ma è ancora visibile (una nuova activity è in foreground ma è trasparente o non copre l'intero schermo) l'activity mantiene lo stato ma può essere uccisa dal sistema in caso di scarsità di memoria stopped: l'activity è completamente oscurata da un'altra activity l'activity mantiene lo stato ma può essere uccisa dal sistema in caso di scarsità di memoria 6
Activity e ciclo di vita Passaggi di stato delle activity se un'activity si trova nello stato paused o stopped, può essere terminata dal sistema attraverso una chiamata al metodo finish(), o uccidendo direttamente il processo 7
Activity e ciclo di vita Passaggi di stato delle activity quando un'activity effettua dei passaggi di stato, viene notificata attraverso dei metodi callback i metodi callback consentono al programmatore di effettuare azioni appropriate al cambiamento di stato 8
Activity e ciclo di vita I sette metodi oncreate(), onstart(), onresume(), onpause(), onstop(), onrestart(), ondestroy(), definiscono l'intero ciclo di vita delle activity il tempo di vita globale di un'activity va dalla chiamata a oncreate() alla chiamata a ondestroy() un'activity effettua la configurazione del proprio stato globale nell'oncreate() e rilascia tutte le risorse ancora da liberare nell'ondestroy() il tempo di vita visibile di un'activity va dalla chiamata onstart() alla chiamata onstop() durante questo tempo l'utente può vedere l'activity a schermo anche se questa potrebbe non essere in foreground onstart() e onstop() possono essere chiamati più volte durante il tempo di vita globale di un'activity 9
Activity e ciclo di vita I sette metodi oncreate(), onstart(), onresume(), onpause(), onstop(), onrestart(), ondestroy(), definiscono l'intero ciclo di vita delle activity il tempo di vita in foreground in un'activity va dalla chiamata onresume() alla corrispondente chiamata onpause() un'activity in foreground è in cima allo stack e può interagire con l'utente le transizioni tra i due stati onresume() e onpause() possono essere molto frequenti, ad esempio onpause() viene chiamato quando il dispositivo va in sleep o quando viene creata una nuova activity onresume() viene chiamato quando vengono inviati un risultato oppure un intent all'activity 10
Activity: metodi callback 11
Activity: metodi callback Metodo oncreate() chiamato alla creazione di un'activity deve essere sempre implementato utilizzato per effettuare la configurazione iniziale dell'activity (creazione delle view, associazione di dati alle liste, etc.) ha un parametro di tipo Bundle che permette di ripristinare lo stato precedente dell'activity, se questo è stato salvato sempre seguito da onstart() 12
Activity: metodi callback Metodo onstart() chiamato appena prima che l'activity diventi visibile all'utente sempre seguito da onresume() Metodo onrestart() chiamato dopo che un'activity è stata stoppata (onstop()) e poco prima di tornare visibile all'utente sempre seguito da onstart() Metodo onresume() chiamato poco prima che l'activity ottenga il focus e permetta l'interazione all'utente sempre seguito da onpause() 13
Activity: metodi callback Metodo onpause() chiamato poco prima che il sistema attivi un'altra activity è altamente consigliato implementare il metodo onpause() per poter salvare dati (commit) in modo persistente, fermare animazioni e tutto ciò che può consumare (inutilmente) CPU (e batteria) deve svolgere il proprio compito velocemente poichè l'activity successiva non può partire fino a quando questo metodo non ritorna seguito da onresume() se l'activity riottiene il focus o da onstop() se l'activity diventa invisibile all'utente successivamente a questo metodo, l'activity può essere terminata (killed) 14
Activity: metodi callback Metodo onstop() chiamato quando l'activity non è più visibile all'utente può essere chiamato quando l'activity sta per essere distrutta o perchè un'altra activity (nuova o già esistente) è stata ripristinata (resumed) e copre quella attuale seguito da onrestart() se l'activity verrà riattivata o da ondestroy() se l'activity verrà distrutta successivamente a questo metodo, l'activity può essere terminata (killed) 15
Activity: metodi callback Metodo ondestroy() chiamato prima della distruzione dell'activity è la chiamata finale che l'activity può ricevere può essere chiamato perchè è stato invocato il metodo finish() o perchè il sistema ha bisogno di liberare risorse è possibile distinguere i due scenari attraverso l'utilizzo del metodo isfinishing() successivamente a questo metodo, l'activity può essere terminata (killed) 16
Activity: metodi callback Le activity che hanno raggiunto uno stato killable dopo l'esecuzione di un metodo callback possono essere terminate in qualsiasi momento un'activity raggiunge uno stato killable al termine dei metodi onpause(), onstop() e ondestroy() onpause() è l'unico metodo dei tre precedenti la cui esecuzione è garantita prima che il processo che ospita l'activity venga terminato, onstop() e ondestroy() potrebbero non venire chiamati per questo motivo, bisogna sfruttare onpause() per effettuare il commit di dati non salvati 17
Activity: salvataggio dello stato Quando un'activity viene distrutta dal sistema per recuperare risorse, il suo stato non viene salvato Se l'utente ritorna all'activity, c'è bisogno di un meccanismo per ripristinare lo stato originale dell'activity Android consente di salvare e ripristinare lo stato di un'activity grazie ai due metodi callback onsaveinstancestate() e onrestoreinstancestate 18
Bundle e metodi callback Per salvare lo stato di un'activity quando viene sospesa e ripristinarlo se e quando l'activity viene riattivata (ad es., nell'oncreate()), vengono sfruttati oggetti di tipo Bundle Oggetti di tipo Bundle sono semplicemente dei contenitori di dati primitivi (int, strings, ) che servono a consentire l'ipc (comunicazione tra processi) La struttura semplice dei Bundle consente una gestione ottimizzata della memoria Non è un meccanismo di salvataggio permanente! 19
Esempio: bundle e metodi callback 20