Pacchi e pacchetti

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

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

Invio di dati tra attività

Quando un'app crea un oggetto Intent da utilizzare in startActivity(android.content.Intent) per avviare una nuova attività, l'app può trasmettere i parametri utilizzando il metodo putExtra(java.lang.String, java.lang.String).

Lo snippet di codice riportato di seguito mostra un esempio di come eseguire questa operazione.

Kotlin

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

Java

Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("media_id", "a1b2c3");
// ...
startActivity(intent);

Il sistema operativo aggrega il valore Bundle sottostante dell'intent. Quindi, il sistema operativo crea la nuova attività, separa i dati e passa l'intento 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 il dismarshalling mediante l'utilizzo di particelle.

In alcuni casi, potrebbe essere necessario un meccanismo per inviare oggetti compositi o complessi tra attività. In questi casi, la classe personalizzata deve implementare Parcelable e fornire il metodo writeToParcel(android.os.Parcel, int) appropriato. Deve inoltre fornire un campo non null denominato CREATOR che implementa l'interfaccia Parcelable.Creator, il cui metodo createFromParcel() viene utilizzato per convertire Parcel nell'oggetto attuale. Per ulteriori informazioni, consulta la documentazione di riferimento per l'oggetto 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 un'eccezione TransactionTooLargeException da parte del sistema.

Invio di dati tra processi

L'invio di dati tra processi e attività è simile a questo. Tuttavia, per l'invio da un processo all'altro, ti consigliamo di non utilizzare pacchetti personalizzati. Se invii un oggetto Parcelable personalizzato da un'app a un'altra, devi assicurarti che la stessa versione della classe personalizzata sia presente in entrambe le app di invio e ricezione. In genere si tratta di una libreria comune per entrambe le app. Può verificarsi un errore se la tua app tenta di inviare un particolabile personalizzato al sistema, perché il sistema non può eseguire il controllo di una classe di cui non è a conoscenza.

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

Il buffer delle transazioni di Binder ha una dimensione fissa limitata, attualmente pari a 1 MB, 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 di binder nell'app come onSaveInstanceState, startActivity e qualsiasi interazione con il sistema. Quando viene superato il limite di dimensioni, viene generata un'eccezione TransactionTooLargeException.

Per il caso specifico di savedInstanceState, la quantità di dati deve essere ridotta perché il processo di sistema deve conservare i dati forniti per tutto il tempo in cui l'utente può tornare a quell'attività (anche se il processo dell'attività viene interrotto). Ti consigliamo di mantenere lo stato salvato a meno di 50.000 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.