Passare un oggetto tra due Activity è come spedire un pacco: non puoi infilare un intero mobile nella fessura della buca delle lettere, devi prima smontarlo.
In Android Java, hai due modi per “smontare” i tuoi oggetti:
- Serializable (il metodo pigro)
- Parcelable (il metodo professionale).
Serializable
Serializable è un’interfaccia standard di Java. Non devi scrivere codice, basta dire ad Android che la tua classe si può “serializzare”.
- Come funziona: Android usa un processo chiamato Riflessione. Guarda la tua classe, capisce com’è fatta e trasforma tutto in byte automaticamente.
- Il problema: È molto lento e consuma molta memoria (e batteria), perché Android deve “indovinare” come smontare l’oggetto ogni volta.
// Basta aggiungere "implements Serializable"
public class User implements Serializable {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
Parcelable
Parcelable è l’alternativa creata da Google appositamente per Android. Qui sei tu a scrivere le “istruzioni di montaggio”.
- Come funziona: Invece di far indovinare al sistema, tu scrivi i dati direttamente in un contenitore chiamato
Parcel. - Perché usarlo: È fino a 10 volte più veloce di Serializable. In un’app professionale, è lo standard.
public class User implements Parcelable {
private String name;
private int age;
// 1. Istruzioni per "RIMONTARE" (Constructor)
// Leggiamo i dati dal pacco (Parcel in) nell'ordine esatto in cui li abbiamo messi
protected User(Parcel in) {
name = in.readString(); // Prima il nome
age = in.readInt(); // Poi l'età
}
// 2. Istruzioni per "SMONTARE" (writeToParcel)
// Scriviamo i dati dentro il pacco (Parcel dest)
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name); // Mettiamo il nome per primo
dest.writeInt(age); // Mettiamo l'età per seconda
}
// 3. L'OPERAIO (CREATOR)
// È un oggetto statico che Android cerca per ricreare l'utente dall'altra parte
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in); // Chiama il costruttore di rimontaggio
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
@Override
public int describeContents() { return 0; } // Quasi sempre 0
}
Come passarli nell’Intent
Il codice per spedire e ricevere l’oggetto è identico per entrambi i metodi, cambia solo il modo in cui Android lo gestisce internamente.
Invio (A)
User utente = new User("Samuele", 25);
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("CHIAVE_USER", utente); // Android capisce da solo se è Parcelable o Serializable
startActivity(intent);
Ricezione
// Se hai usato Parcelable (Consigliato)
User utente = getIntent().getParcelableExtra("CHIAVE_USER");
// Se hai usato Serializable
User utente = (User) getIntent().getSerializableExtra("CHIAVE_USER");
Riassunto
| Serializable | Parcelable | |
| Velocità | Tartaruga | Ghepardo |
| Sforzo | Zero (implements) | Scrivere i metodi (o farli generare) |

