Pacchi e pacchetti

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.