Vorteile der Verwendung von Bundle anstelle von direktem Intent putExtra () in Android

79

In meiner Android-Anwendung verwende ich immer die direkte putExtra()Funktion der IntentKlasse, um eine beliebige Anzahl von Werten an new zu übergeben Activity.
So was:

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

Ich kenne mich mit BundleAndroid aus und habe gesehen, dass Leute BundleWerte an neue weitergeben Activity.
So was:

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);

Hier habe ich 2 Zweifel.
Warum sollte ich verwenden, Bundlewenn ich Werte an new übergeben kann, Activityindem ich sie direkt an Intentablege?
Was sind die Vorteile der Verwendung Bundleanstelle von direkt Intent putExtra()?

Vishal Vijay
quelle

Antworten:

65

Es macht wenig (wenn überhaupt einen Unterschied). Der Code, der ein zusätzliches Bundle verwendet, ist etwas schwerer (es macht in keiner praktischen Anwendung einen Unterschied) und etwas einfacher zu verwalten, da er allgemeiner ist.

Wenn Sie eines Tages entscheiden, dass Sie vor dem Senden von Informationen innerhalb einer Absicht die Daten in die Datenbank serialisieren möchten, ist es etwas sauberer, ein Bundle zu haben, das Sie serialisieren, einer Absicht hinzufügen und dann einem PendingBundle zuführen können - alles mit einem Objekt.

[aktualisieren]

Eine Klarstellung (wegen einiger anderer Antworten).

Extras ist ein zusätzliches Bundle, das jeder Intent möglicherweise trägt (aber nicht muss). Daher gibt es keine Alternative zwischen der Verwendung eines Bundles oder der Nichtverwendung. Sie verwenden in beiden Fällen ein Bundle.

Bei der ersten Verwendung putExtrawird ein mExtrasBundle in Intent initialisiert und alle folgenden putExtra an dieses delegiert. Das Bundle selbst ist für Sie nicht zugänglich (dies ist beabsichtigt, um bestimmte Arten von Fehlern zu vermeiden).

putExtras legt Ihr Bundle nicht in Intent ab. Stattdessen wird es in das aktuelle Intent-Bundle kopiert (oder wie bei erstellt putExtra). Aus diesem Grund ist es etwas schwerer (Sie haben zwei Bündel anstelle von einem und zahlen den Preis für das Kopieren).

Der springende Punkt ist: Wenn Sie verwenden putExtras, können Sie immer noch nicht auf das reale Paket innerhalb der Absicht zugreifen. ABER - Sie haben eine Kopie für alles, was Sie sonst noch damit machen möchten. Halten Sie sich gerne auf dem Laufenden, um in eine andere Absicht zu kopieren (wenn Sie viele ähnliche Absichten senden).

fdreger
quelle
Sagen Sie mir, ob ich einen Code wie diesen verwende. Intent intent = new Intent (this, MyActivity.class); intent.putExtra (ID_EXTRA1, "1"); Bundle-Extras = neues Bundle (); extras.putString ("EXTRA_USERNAME", "mein_Benutzername"); extras.putString ("EXTRA_PASSWORD", "my_password"); intent.putExtras (Extras); startActivity (Absicht); Wie kann ich auf ID_EXTRA1
Vishal Vijay
@VishalVijay Sie können eine Kopie des Extras-Bundles (nicht des Originals) erhalten, indem Sie getExtras aufrufen. Vorsicht, es könnte null zurückgeben.
fdreger
So kann ich ID_EXTRA1 und Extras (Bundle) aus der neuen Aktivität rigt abrufen.
Vishal Vijay
Entschuldigung, ich konnte anhand der Antwort auf diese Frage nicht genau sagen, aber wenn ich eine Absicht habe, die ausschließlich zum Bearbeiten von ValueObjects-Daten dient, übergebe ich nur den Index, dessen VO aus statischen Daten verwendet werden soll Ressource. Da dies obligatorisch ist, sollte dies in startActivity(intent, options)oder erfolgen intent.putExtra()? Ich weiß, dass beides möglich ist, aber ich denke nur an bewährte Verfahren? Normalerweise berühre ich das an onCreate übergebene Bundle nicht, aber ich bin unerfahren und suche nach Meinungen.
WORMSS
putExtras (Bundle) delegiert NICHT an die ursprüngliche Absicht. Die ursprüngliche Absicht hat ein Extra, das ein Bündel ist.
Lena Bru
17

Zusätzlicher Vorteil : Sobald Daten in einem Bundle gespeichert sind, können Sie dieselben Daten mit mehreren Absichten senden. (Nur in dem Fall sollen mehrere Absichten gesendet werden).

vanguard69
quelle
6

Bundles sind cool, weil Sie ihre Erstellung / das Lesen einfacher isolieren können, wodurch der Code, der die Bundles behandelt, vom Code der Benutzeroberfläche getrennt wird.

In den meisten Fällen ist dies nutzlos, da Sie die kleinstmögliche Datenmenge übertragen möchten (normalerweise nur ein paar Zeichenfolgen, eine ID ...).

njzk2
quelle