Ricreare oggetti complessi alla riapertura di una activity

In un’applicazione android è possibile che una activity sia creata e poi distrutta, ad esempio quando l’utente apre un’altra activity o quando preme il tasto back, in un secondo tempo l’utente riapre la stessa activity che è ricreata utilizzando i dati salvati prima della precedente distruzione dell’activity.
I dati sono salvati in un oggetto Bundle nel metodo onSaveInstanceState e recuperati successivamente nel metodo onRestoreInstanceState (vedi Recreating an Activity).
La classe Bundle mette a disposizione diversi metodi setter and getter per salvare e recuperare dati come getInt e setInt per gli interi e metodi analoghi per altri tipi di dati primitivi, stringhe ed array a una dimensione.
In questo articolo riporto varie modalità per salvare e recuperare oggetti più complessi come ad esempio il seguente CustomObject:

L’activity che salva e recupera oggetti di questo tipo è:

I metodi onSaveInstanceState e onRestoreInstanceState sono divisi in sezioni in cui l’oggetto CustomObject o un array a una o più dimensioni di questo oggetto è salvato e poi recuperato.
Tutte le sezioni tranne l’ultima usano una delle sequenti interfacce:

  • Serializable: una “maker interface” senza metodi da implementare, disponibile in Java
  • Parcelable: un’interfaccia, disponibile in Android SDK

Fra le due tecniche Parcelable è la più efficiente, in rete trovi molta documentazione al riguardo, come qui.

  1. sezione 1: qui uso i metodi putParcelable e getParcelable per classi che estendono l’interfaccia Parcelable; in questo caso la classe CustomParcelableObject estende CustomObject e implementa Parcelable
  2. sezione 2: qui uso i metodi putSerializable e getSerializable per classi che estendono l’interfaccia Serializable; in questo caso la classe CustomSerializableObject estende CustomObject e implementa Serializable
  3. sezione 3: qui l’oggetto da ripristinare è un array a una dimensione di oggetti CustomParcelableObject che estendono Parcelable utilizzando i metodi putParcelableArray e getParcelableArray
  4. sezione 4: qui l’oggetto da ripristinare è un array a una dimensione di oggetti CustomSerializableObject che estendono Serializable utilizzando i metodi putSerializable e getSerializable; tieni presente che gli array sono oggetti che sempre estendono l’interfaccia Serializable
  5. sezione 5: qui l’oggetto da ripristinare è un array a due dimensioni (CustomParcelableObject[][] array), campo di una classe wrapper che estende Parceable:
  6. sezione 6: qui l’oggetto da ripristinare è un array a due dimensioni di CustomSerializableObject
  7. sezione 7: qui l’oggetto CustomObject non è salvato e poi ripristinato come nelle sezioni precedenti ma è conservato nella classe MyApplication che estende Application:

    questo metodo può essere usato in situazione come la rotazione dello schermo in cui l’activity è distrutta ma non l’oggetto Application che deve essere specificato anche nel file AndroidManifest.xml

    come puoi vedere in Google developers la classe Application può essere usata per “maintain global application state” ma in rete trovi anche alcune problematiche come qui.
  8. Pui scaricare l’intera app qui, per testarla è sufficiente ruotare la device o l’emulatore (Ctrl F11).

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.