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.