2013-03-06 5 views
60

In meiner Android-Anwendung verwende ich immer direkte putExtra() Funktion der Intent Klasse, um eine beliebige Anzahl von Wert an neue Activity übergeben.
So:Vorteile der Verwendung von Bundle anstelle von direkten Absicht putExtra() in Android

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

Ich weiß über Bundle in Android und ich habe Menschen Bundle verwenden, um neue Activity für das Bestehen Werte gesehen.
So:

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 Bundle verwenden, wenn ich Werte an Activity weiterleiten kann, indem ich es direkt auf Intent setze?
Was sind die Vorteile der Verwendung von Bundle anstelle von direkten IntentputExtra()?

Antwort

56

Es macht wenig (wenn überhaupt Unterschied) übertragen werden sollen. Der Code, der ein zusätzliches Paket verwendet, ist etwas schwerer (in der praktischen Anwendung wird es keinen Unterschied machen) und etwas einfacher zu handhaben, da er allgemeiner ist.

Wenn Sie eines Tages entscheiden, dass - bevor Sie Informationen innerhalb einer Absicht senden - Sie die Daten in die Datenbank serialisieren möchten - wird es ein bisschen sauberer sein, ein Bündel zu haben, das Sie serialisieren, ergänzen und dann füttern können ein PendingBundle - alles mit einem Objekt.

[update]

Eine Klärung (wegen einigen anderen Antworten).

Extras ist ein zusätzliches Bündel, das jeder Intent übertragen könnte (aber nicht muss), so dass es keine Alternative zwischen der Verwendung eines Bündels oder der Nichtnutzung gibt. Sie verwenden ein Bündel in beide Richtungen.

Wenn Sie das erste Mal putExtra verwenden, wird ein mExtras Bündel in Intent initialisiert, und alle folgenden putExtra werden an dieses delegiert. Auf das Paket selbst kann nicht zugegriffen werden (dies ist beabsichtigt, um bestimmte Arten von Fehlern zu vermeiden).

putExtras nicht setzen Sie Ihr Bündel in Intent. Stattdessen kopiert es es in das aktuelle Absichtsbündel (oder erstellt eins wie bei putExtra). Deshalb ist es etwas schwerer (Sie haben zwei Bündel statt eines und zahlen den Preis für das Kopieren).

Die Crux ist - wenn Sie putExtras verwenden, können Sie immer noch nicht auf das echte Bündel in der Absicht zugreifen. ABER - Sie haben eine Kopie für alles, was Sie sonst noch damit machen wollen. Wie bleiben Sie in einer anderen Absicht Kopie (wenn Sie viele ähnliche Absichten senden).

+0

Sag mir, wenn 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_BENUTZERNAME", "mein_Benutzername"); extras.putString ("EXTRA_PASSWORD", "mein_passwort"); intention.putExtras (Extras); startActivity (Absicht); Wie kann ich auf ID_EXTRA1 zugreifen? –

+0

@VishalVijay Sie können eine Kopie des Extras-Bundles (nicht die ursprüngliche) erhalten, indem Sie getExtras aufrufen. Vorsicht, es könnte null zurückgeben. – fdreger

+0

So kann ich ID_EXTRA1 und Extras (Bundle) von der neuen Aktivität Rig bekommen. –

5

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

In den meisten Fällen, die nutzlos sind, wie Sie die kleinstmögliche Menge an Daten (in der Regel nur ein paar Strings, ein id ...)

4

können Sie beziehen this und auch this.

Sie können mehrere oder mehrere Daten in einem Bündel senden und durch Intent senden. oder eine andere Möglichkeit besteht darin, mehrere Anweisungen von PutExtra() hinzuzufügen.

Und es gibt keinen so wichtigen Unterschied nach meinem Wissen.

12

Zusätzlicher Vorteil: Sobald Daten in einem Bundle abgelegt sind, können Sie dieselben Daten über mehrere Absichten senden. (Nur in diesem Fall müssen mehrere Absichten gesendet werden).