Objetos parcelables y paquetes

Los objetos Parcelable y Bundle están diseñados para usarse entre límites de procesos como con transacciones de IPC y Binder, entre actividades con intents y para almacenar el estado transitorio en los cambios de configuración. En esta página, se proporcionan recomendaciones y prácticas recomendadas para usar objetos Parcelable y Bundle.

Nota: Parcel no es un mecanismo de serialización de uso general y nunca debes almacenar datos de Parcel en el disco ni enviarlos por medio de la red.

Cómo enviar datos entre actividades

Cuando una app crea un objeto Intent para usar en startActivity() al iniciar una actividad nueva, la app puede pasar parámetros con el método putExtra().

En el siguiente fragmento de código, se muestra un ejemplo de cómo realizar esta operación.

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

El SO empaqueta el Bundle subyacente del intent. Luego, el SO crea la nueva actividad, desempaqueta los datos y pasa el intent a la nueva actividad.

Te recomendamos que uses la clase Bundle para configurar primitivas que el SO conozca en objetos Intent. La clase Bundle está muy optimizada para asociar y desasociar el uso de parcelas.

En algunos casos, es posible que necesites pasar objetos complejos entre actividades o conservarlos en el estado de la IU. En esos casos, la clase personalizada debe implementar un objeto Parcelable. En el caso de las apps modernas de Kotlin y Jetpack Compose, el enfoque recomendado es usar la anotación @Parcelize. Esto genera automáticamente la lógica de serialización necesaria para controlar tus datos de forma segura cuando usas paquetes. Este es el mismo enfoque que se usa para controlar tus datos cuando usas rememberSaveable. Para obtener más información sobre el uso de @Parcelize, consulta Generador de implementación de Parcelable.

Cuando envíes datos mediante un intent, debes tener cuidado de limitar el tamaño de los datos a unos pocos KB, ya que, si se envían demasiados, es posible que el sistema arroje una excepción TransactionTooLargeException.

Cómo enviar datos entre procesos

El envío de datos entre procesos es similar a hacerlo entre actividades. Sin embargo, te recomendamos que, cuando envíes mensajes entre procesos, no uses objetos parcelables personalizados. Si envías un objeto Parcelable personalizado de una app a otra, debes asegurarte de que la misma versión exacta de la clase personalizada esté presente en las apps de envío y recepción. Por lo general, esta podría ser una biblioteca común utilizada en ambas apps. Es posible que se produzca un error si tu app intenta enviar un objeto parcelable personalizado al sistema, ya que el sistema no puede ordenar una clase que no conoce.

Por ejemplo, una app puede establecer una alarma por medio de la clase AlarmManager y usar un Parcelable personalizado en el intent de la alarma. Cuando suena la alarma, el sistema modifica el Bundle del intent de extras a fin de agregar un recuento repetido. Esta modificación puede hacer que el sistema quite el objeto Parcelable personalizado de los extras. A su vez, esta eliminación puede provocar una falla en la app cuando esta recibe el intent de la alarma modificada, porque la app espera recibir datos adicionales que ya no están allí.

El búfer de transacciones de Binder tiene un tamaño fijo limitado, actualmente de 1 MB, que comparten todas las transacciones en curso del proceso. Como este límite se encuentra en el nivel del proceso en lugar de en el de cada actividad, estas transacciones incluyen todas las transacciones de Binder, como startActivity, rememberSaveable (que usa onSaveInstanceState en segundo plano) y cualquier interacción con el sistema. Cuando se supera el límite de tamaño, se arroja una TransactionTooLargeException.

En el caso específico de guardar el estado con rememberSaveable, se debe mantener una pequeña cantidad de datos porque el proceso del sistema debe retener los datos proporcionados durante el tiempo que el usuario pueda volver a esa actividad (incluso si se elimina el proceso). Te recomendamos que mantengas el estado guardado por debajo de los 50 KB de datos.

Nota: En Android 7.0 (nivel de API 24) y versiones posteriores, el sistema muestra una TransactionTooLargeException como una excepción de tiempo de ejecución. En versiones anteriores de Android, el sistema solo muestra una advertencia en logcat.