Objetos parcelables y paquetes

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

Nota: Parcel no es una función de uso general un mecanismo de serialización, y nunca debes almacenar datos de Parcel en el disco o enviarlos por 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 aplicación puede pasar de parámetros con 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 establecer primitivas que el SO conozca en Intent. La clase Bundle es muy optimizados para el ordenamiento y desalineación mediante paquetes.

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 Parcelable y proporcionar los permisos writeToParcel(android.os.Parcel, int). También debe proporcionar un campo no nulo llamado CREATOR que implementa la interfaz Parcelable.Creator, que 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 se envían 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, al enviar entre procesos, te recomendamos que no uses objetos parcelables personalizados. Si envías una configuración Parcelable de una app a otra, debes asegurarte de que la exactamente la misma versión de la clase personalizada presentes en las apps de envío y recepción. Por lo general, esta podría ser una biblioteca común que se usen en ambas apps. Se puede producir un error si tu app intenta enviar un objeto parcelable personalizado a porque este no puede deserializar una clase que desconoce.

Por ejemplo, una aplicación puede establecer una alarma con la clase AlarmManager y usa un Parcelable personalizado en el intent de la alarma. Cuando suena la alarma, el sistema modifica Bundle de extras para agregar un recuento de repetición. Esta modificación puede hacer que el sistema elimine la Parcelable de los extras. A su vez, esta eliminación puede provocar falla 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 todos. transacciones en curso. Como este límite se encuentra en el proceso en lugar de a 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 el tamaño se supera el límite, se genera una TransactionTooLargeException.

Para el caso específico de savedInstanceState, la cantidad de datos debería ser pequeña. debido a que el proceso del sistema necesita conservar los datos proporcionados durante el tiempo que el usuario puede volver a esa actividad (incluso si se cierra 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 arroja un TransactionTooLargeException como una excepción de entorno de ejecución. En versiones anteriores de Android, el sistema solo muestra una advertencia en logcat.