Ventajas de usar Bundle en lugar de putExtra () de intención directa en Android

79

En mi aplicación de Android, siempre estoy usando la putExtra()función directa de Intentclase para pasar cualquier número de valor a nuevo Activity.
Me gusta esto:

Intent i = new Intent(this, MyActivity.class);
i.putExtra(ID_EXTRA1, "1");
i.putExtra(ID_EXTRA2, "111");
startActivity(i);

Conozco Bundleen Android y he visto que la gente está usando Bundlepara pasar valores a nuevos Activity.
Me gusta esto:

Intent intent = new Intent(this, MyActivity.class);
Bundle extras = new Bundle();
extras.putString("EXTRA_USERNAME","my_username");
extras.putString("EXTRA_PASSWORD","my_password");
intent.putExtras(extras);
startActivity(intent);

Aquí tengo 2 dudas.
¿Por qué debería usar Bundlesi puedo pasar valores a nuevo Activityponiéndolo directamente en Intent?
¿Cuáles son las ventajas de usar en Bundlelugar de directo Intent putExtra()?

Vishal Vijay
fuente

Respuestas:

65

Hace poca (si es que hay alguna diferencia). El código que usa un paquete adicional es un poco más pesado (no hará ninguna diferencia en ninguna aplicación práctica) y un poco más fácil de administrar, siendo más general.

Si un día decide que, antes de enviar información dentro de una intención, desea serializar los datos en la base de datos, será un poco más limpio tener un paquete que pueda serializar, agregar a una intención y luego alimentar a un PendingBundle, todo con un objeto.

[actualizar]

Una aclaración (debido a algunas otras respuestas).

Extras es un paquete adicional que cada Intent puede llevar (pero no es obligatorio), por lo que no hay alternativa entre usar un paquete o no usarlo. Estás usando un paquete de cualquier manera.

La primera vez que lo utiliza putExtra, mExtrasse inicializa un paquete dentro de Intent y se le delegan todos los putExtra siguientes. El paquete en sí es inaccesible para usted (esto es por diseño, para evitar cierto tipo de errores).

putExtras no coloca su paquete dentro de Intent. En su lugar, lo copia al paquete de intención actual (o crea uno, como con putExtra). Por eso es un poco más pesado (tienes dos paquetes en lugar de uno y pagas el precio de la copia).

El quid es: si lo usa putExtras, aún no puede acceder al paquete real dentro de la intención. PERO - tienes una copia para cualquier otra cosa que quieras hacer con ella. Como quedarse para copiar en otra intención (si envía muchas intenciones similares).

fdreger
fuente
Dime si uso un código como este Intent intent = new Intent (this, MyActivity.class); intent.putExtra (ID_EXTRA1, "1"); Extras del paquete = nuevo paquete (); extras.putString ("EXTRA_USERNAME", "my_username"); extras.putString ("EXTRA_PASSWORD", "mi_password"); intent.putExtras (extras); startActivity (intención); ¿Cómo puedo acceder a ID_EXTRA1
Vishal Vijay
@VishalVijay puede obtener una copia del paquete de extras (no el original) llamando a getExtras. Cuidado, podría devolver un valor nulo.
fdreger
Entonces puedo obtener ID_EXTRA1 y extras (paquete) del nuevo derecho de actividad.
Vishal Vijay
Lo siento, no pude decirlo por la respuesta a esta pregunta pero, si tengo una intención con el único propósito de editar los datos de ValueObjects, todo lo que hago es pasar el índice de qué VO usar a partir de datos estáticos recurso. Dado que es obligatorio, ¿debería hacerse en startActivity(intent, options)o intent.putExtra()? Sé que se pueden hacer ambas cosas, pero solo estoy pensando en la mejor práctica. No suelo tocar el paquete que se pasa a onCreate, pero no tengo experiencia, por lo que busco opiniones.
WORMSS
putExtras (paquete) NO delega a la intención original. La intención original tiene un extra que es un paquete.
Lena Bru
17

Ventaja adicional : una vez que los datos se colocan en un paquete, puede enviar los mismos datos a través de múltiples intentos. (Solo en el caso, se enviarán múltiples intenciones).

vanguard69
fuente
6

Los paquetes son geniales porque puede aislar su creación / lectura más fácilmente, separando así el código que maneja los paquetes del código de la interfaz de usuario.

En la mayoría de los casos, eso es inútil, ya que querrá transmitir la menor cantidad posible de datos (generalmente solo un par de cadenas, una identificación ...)

njzk2
fuente