Gli oggetti Parcelable
e Bundle
sono pensati per essere
utilizzati oltre i confini dei processi, ad esempio con IPC/Binder
transazioni, tra attività con intent e per archiviare lo stato temporaneo
modifiche. Questa pagina fornisce consigli e best practice per l'utilizzo
Parcelable
e Bundle
oggetti.
Nota:Parcel
non è un uso generico.
meccanismo di serializzazione e non dovresti mai
archiviare tutti i dati Parcel
su disco o inviarli tramite la rete.
Invio di dati tra attività
Quando un'app crea un oggetto Intent
da utilizzare in
startActivity(android.content.Intent)
all'avvio di una nuova attività,
l'app può passare
utilizzando i parametri putExtra(java.lang.String, java.lang.String)
.
Il seguente snippet di codice 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 suddivide in pacchetti 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
Intent
oggetti. Il corso Bundle
è altamente
ottimizzate per il marshalling e il disallineamento tramite pacchi.
In alcuni casi, potrebbe essere necessario un meccanismo per inviare oggetti compositi o complessi tra le attività.
In questi casi, la classe personalizzata deve implementare Parcelable e fornire il necessario
writeToParcel(android.os.Parcel, int)
.
Deve inoltre fornire un campo diverso da null denominato CREATOR
che
implementa l'interfaccia Parcelable.Creator
, la cui
createFromParcel()
viene utilizzato per riconvertire Parcel
nell'oggetto corrente.
Per ulteriori informazioni,
consulta la documentazione di riferimento per l'oggetto Parcelable
.
Quando invii dati tramite un intent, devi prestare attenzione a limitare le dimensioni dei dati a poche kB.
L'invio di troppi dati può causare la generazione di un errore nel sistema
TransactionTooLargeException
eccezione.
Invio di dati tra i processi
L'invio di dati tra i processi è simile a questo tra un'attività e l'altra. Tuttavia, quando invii
tra i processi, ti consigliamo di non utilizzare oggetti parcelable personalizzati. Se invii una richiesta
Parcelable
da un'app all'altra, devi assicurarti che
la stessa versione della classe personalizzata
presenti sia nell'app di invio che in quella di ricezione. In genere potrebbe trattarsi di una libreria comune
utilizzata in entrambe le app. Potrebbe verificarsi un errore se la tua app tenta di inviare un pacco personalizzato a
il sistema, perché non può separare una classe di cui non è a conoscenza.
Ad esempio, un'app potrebbe impostare una sveglia usando
la classe AlarmManager
e usa un oggetto Parcelable
personalizzato
sull'intento della sveglia. Quando una sveglia suona, il sistema modifica il messaggio di intent
Bundle
di extra da aggiungere
un conteggio ripetuto. Questa modifica può comportare la rimozione da parte del sistema
Parcelable
extra. Questa rimozione, a sua volta, può comportare
si arresta in modo anomalo quando riceve l'intent di allarme modificato, perché l'app prevede
ricevere dati aggiuntivi che non sono più disponibili.
Il buffer di transazione di Binder ha una dimensione fissa limitata, attualmente pari a 1 MB, che è condivisa da tutti transazioni in corso per il processo. Poiché questo limite è in fase di elaborazione invece che a livello di attività, queste transazioni includono tutte le transazioni binder in l'app, come onSaveInstanceState, startActivity e qualsiasi interazione con il sistema. Quando le dimensioni viene superato il limite massimo, 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 finché l'utente può tornare indietro a tale attività (anche se il processo dell'attività si interrompe). 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 invia una notifica TransactionTooLargeException come eccezione di runtime. Nelle versioni precedenti di Android, il sistema mostra solo un avviso in logcat.