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 los 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(android.content.Intent)
al iniciar una nueva Actividad, la app puede pasar parámetros por medio del método putExtra(java.lang.String, java.lang.String)
.
En el siguiente fragmento de código, se muestra un ejemplo de cómo realizar esta operación.
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);
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 un mecanismo para enviar objetos compuestos o complejos entre actividades.
En esos casos, la clase personalizada debe implementar un objeto Parcelable y proporcionar el método writeToParcel(android.os.Parcel, int)
apropiado.
También debe proporcionar un campo no nulo llamado CREATOR
que implemente la interfaz Parcelable.Creator
, cuyo método createFromParcel()
se usa para convertir el elemento Parcel
nuevamente en el objeto actual.
Para obtener más información, consulta la documentación de referencia del objeto 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 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 onSaveInstanceState, startActivity y cualquier interacción con el sistema. Cuando se supera el límite de tamaño, se genera una TransactionTooLargeException.
En el caso específico de savedInstanceState, 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,000 datos.
Nota: En Android 7.0 (API nivel 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.