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/Binder, entre actividades con intents y para almacenar el estado transitorio de los cambios de configuración. En esta página, se proporcionan sugerencias 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 a través 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 actividad nueva, la app puede pasar parámetros con el 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 actividad nueva, 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 ordenar 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) adecuado. 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 Parcel de nuevo 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, Si envías demasiados datos, 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, cuando envíes mensajes entre procesos, te recomendamos que 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 que se usa en ambas apps. Puede ocurrir un error si tu app intenta enviar un objeto parcelable personalizado al sistema, ya que este no puede ordenar una clase que no conoce.

Por ejemplo, una app puede establecer una alarma con 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 para agregar un recuento repetido. Esta modificación puede hacer que el sistema quite el Parcelable personalizado de los extras. A su vez, esta eliminación puede provocar que la app falle cuando recibe el intent de alarma modificado, 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. Dado que este límite se encuentra en el nivel del proceso en lugar de en el nivel por actividad, estas transacciones incluyen todas las transacciones de Binder en la app, 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, la cantidad de datos debe ser pequeña, ya que el proceso del sistema debe conservar los datos proporcionados durante el tiempo que el usuario pueda volver a esa actividad (incluso si se finaliza el proceso de la actividad). Te recomendamos que mantengas el estado guardado por debajo de los 50,000 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.