Pacchi e pacchetti

Gli oggetti Parcelable e Bundle sono progettati per essere utilizzati tra i limiti dei processi, ad esempio con le transazioni IPC/Binder, tra le attività con gli intent e per archiviare lo stato temporaneo tra le modifiche alla configurazione. Questa pagina fornisce consigli e best practice per l'utilizzo degli oggetti Parcelable e Bundle.

Nota: Parcel non è un meccanismo di serializzazione per uso generico e non devi mai archiviare i dati Parcel su disco o inviarli tramite la rete.

Invio di dati tra le attività

Quando un'app crea un oggetto Intent da utilizzare in startActivity() per avviare una nuova attività, può passare i parametri utilizzando il metodo putExtra().

Il seguente snippet di codice mostra un esempio di come eseguire questa operazione.

val intent = Intent(this, MyActivity::class.java).apply {
    putExtra("media_id", "a1b2c3")
    // ...
}
startActivity(intent)

Il sistema operativo suddivide l'oggetto Bundle sottostante dell'intent. Poi, il sistema operativo crea la nuova attività, annulla la suddivisione dei dati e passa l'intent alla nuova attività.

Ti consigliamo di utilizzare la classe Bundle per impostare le primitive note al sistema operativo sugli oggetti Intent. La classe Bundle è altamente ottimizzata per il marshalling e l'unmarshalling utilizzando i pacchetti.

In alcuni casi, potrebbe essere necessario passare oggetti complessi tra le attività o conservarli nello stato dell'UI. In questi casi, la classe personalizzata deve implementare Parcelable. Per le moderne app Kotlin e Jetpack Compose, l'approccio consigliato è utilizzare l'annotazione @Parcelize. Questa genera automaticamente la logica di serializzazione necessaria per gestire in sicurezza i dati quando si utilizzano i bundle. Questo è lo stesso approccio utilizzato per gestire i dati quando si utilizza rememberSaveable. Per ulteriori informazioni sull'utilizzo di @Parcelize, consulta Generatore di implementazione Parcelable.

Quando invii dati tramite un intent, devi fare attenzione a limitare le dimensioni dei dati a pochi KB. L'invio di troppi dati può causare la generazione di un'eccezione TransactionTooLargeException da parte del sistema.

Invio di dati tra i processi

L'invio di dati tra i processi è simile a quello tra le attività. Tuttavia, quando invii dati tra i processi, ti consigliamo di non utilizzare oggetti Parcelable personalizzati. Se invii un oggetto Parcelable personalizzato da un'app a un'altra, devi assicurarti che la stessa versione esatta della classe personalizzata sia presente sia nell'app di invio sia in quella di ricezione. In genere, si tratta di una libreria comune utilizzata in entrambe le app. Può verificarsi un errore se l'app tenta di inviare un oggetto Parcelable personalizzato al sistema, perché il sistema non può annullare il marshalling di una classe di cui non è a conoscenza.

Ad esempio, un'app potrebbe impostare una sveglia utilizzando la classe AlarmManager e utilizzare un oggetto Parcelable personalizzato nell'intent della sveglia. Quando l'allarme si attiva, il sistema modifica l'oggetto Bundle degli extra dell'intent per aggiungere un conteggio delle ripetizioni. Questa modifica può comportare la rimozione dell'oggetto Parcelable personalizzato dagli extra da parte del sistema. Questa rimozione, a sua volta, può causare l'arresto anomalo dell'app quando riceve l'intent dell'allarme modificato, perché l'app si aspetta di ricevere dati extra che non sono più presenti.

Il buffer di base per le transazioni Binder ha una dimensione fissa limitata (attualmente 1 MB) che viene condivisa da tutte le transazioni in corso per il processo. Poiché questo limite è a livello di processo anziché a livello di attività, queste transazioni includono tutte le transazioni Binder nell'app, come startActivity, rememberSaveable (che utilizza onSaveInstanceState sotto il cofano) e qualsiasi interazione con il sistema. Quando viene superato il limite di dimensioni, viene generata un'eccezione TransactionTooLargeException.

Nel caso specifico del salvataggio dello stato con rememberSaveable, la quantità di dati deve essere ridotta perché il processo di sistema deve conservare i dati forniti finché l'utente può tornare a questa attività (anche se il processo dell'attività viene terminato). Ti consigliamo di mantenere lo stato salvato a meno di 50 KB di dati.

Nota: in Android 7.0 (livello API 24) e versioni successive, il sistema genera un'eccezione TransactionTooLargeException come eccezione di runtime. Nelle versioni precedenti di Android, il sistema mostra solo un avviso in logcat.