Was ist ein "Bundle" in einer Android-Anwendung?


Antworten:


278

Bundles werden im Allgemeinen zum Übertragen von Daten zwischen verschiedenen Android-Aktivitäten verwendet. Es hängt von Ihnen ab, welche Art von Werten Sie übergeben möchten, aber Bundles können alle Arten von Werten enthalten und an die neue Aktivität übergeben.

Sie können es so verwenden:

Intent intent = new...
Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("myKey", AnyValue);  
startActivity(intent);

Sie können die übergebenen Werte erhalten, indem Sie Folgendes tun:

Bundle extras = intent.getExtras(); 
String tmp = extras.getString("myKey");

Weitere Informationen finden Sie unter:


3
Warum nicht einfach System.object direkt verwenden und besetzen?
Lovespring

78

Übergeben Sie Daten zwischen Aktivitäten mithilfe von Bundleund IntentObjekten.


Sie erstellen zuerst ein BundleObjekt

Bundle b = new Bundle();

Verknüpfen Sie dann die darin gespeicherten Zeichenfolgendaten anystringmit dem Bündelschlüssel"myname"

b.putString("myname", anystring);

Erstellen Sie nun ein IntentObjekt

Intent in = new Intent(getApplicationContext(), secondActivity.class);

Übergeben Sie das Bundle-Objekt ban die Absicht

in.putExtras(b);

und starten Sie die zweite Aktivität

startActivity(in);

In der zweiten Aktivität müssen wir auf die Daten zugreifen, die von der ersten Aktivität übergeben wurden

Intent in = getIntent();

Jetzt müssen Sie die Daten aus dem Bundle abrufen

Bundle b = in.getExtras();

Schließlich erhalten Sie den Wert der Zeichenfolgendaten, die dem benannten Schlüssel zugeordnet sind "myname"

String s = b.getString("myname");

Dies ist wirklich eine gute Antwort, danke dafür.
Abhishek Garg

67

Ich muss hinzufügen, dass Bundles von Aktivitäten verwendet werden, um Daten in Zukunft an sich selbst weiterzugeben.

Wenn sich der Bildschirm dreht oder wenn eine andere Aktivität gestartet wird, wird die Methode protected void onSaveInstanceState(Bundle outState)aufgerufen und die Aktivität zerstört. Später wird eine weitere Instanz der Aktivität erstellt und public void onCreate(Bundle savedInstanceState)aufgerufen. Wenn die erste Instanz der Aktivität erstellt wird, ist das Bundle null. und wenn das Bundle nicht null ist, setzt die Aktivität einige Geschäfte fort, die vom Vorgänger gestartet wurden.

Android speichert den Text automatisch in Textfeldern, speichert jedoch nicht alles, und manchmal treten subtile Fehler auf.

Das häufigste Anti-Pattern ist jedoch die Annahme, dass onCreate()dies nur eine Initialisierung ist. Es ist falsch, weil es auch den Zustand wiederherstellen muss.

Es besteht die Möglichkeit, dieses Verhalten "Aktivität bei Rotation neu erstellen" zu deaktivieren. Es verhindert jedoch keine Fehler im Zusammenhang mit dem Neustart, sondern erschwert nur deren Erwähnung.

Beachten Sie auch, dass die einzige Methode, deren Aufruf garantiert ist, wenn die Aktivität zerstört werden soll, ist onPause(). (Siehe das Diagramm zum Aktivitätslebenszyklus in den Dokumenten.)


Warum ein Bundle verwenden, wenn wir nur ein Mapping verwenden können? Danke Ted!
Ruchir Baronia

4
Bundle wird nicht nur von Activity verwendet. Es wird auch von Fragment verwendet, um Zustände nach dem Drehen beizubehalten.
Kai Wang

47

A Bundleist einem Java- MapObjekt sehr ähnlich , das zugeordnet istString Schlüssel Werten zuordnet. Es wird verwendet, um Informationen zwischen Aktivitäten und anderen Anwendungskomponenten zu übertragen. Es wird auch vom Framework zum Erfassen und Wiederherstellen von Statusinformationen verwendet.

Der Grund, warum Android keine einfachen alten MapObjekte verwendet, ist, dass Mapes zu flexibel ist. Es kann Objekte enthalten (z. B. E / A-Streams), die nicht serialisiert werden können. Die BundleAPI beschränkt die Objekttypen, die einem Bundle hinzugefügt werden können, so, dass der Inhalt des Bundles garantiert serialisierbar ist. Das Android-Framework basiert auf dieser Eigenschaft.

Ich schlage vor, dass Sie die Dokumentation zu den Anwendungsgrundlagen lesen . Dies erklärt unter anderem, was Bündel und Absichten sind und wofür sie verwendet werden.


14

Bundles können verwendet werden, um beliebige Daten über Absichten von einer Aktivität zu einer anderen zu senden. Wenn Sie eine Absicht senden, werden interessierte Aktivitäten (und andere BroadcastReciever) darüber informiert. Eine Absicht kann ein Bundle enthalten, sodass Sie zusätzliche Daten zusammen mit der Absicht senden können.

Bundles sind Schlüsselwertzuordnungen, also in gewisser Weise wie ein Hash, aber sie sind nicht streng auf eine einzelne String / Foo-Objektzuordnung beschränkt. Beachten Sie, dass nur bestimmte Datentypen als "Paketierbar" betrachtet werden und in der Bundle-API explizit angegeben sind.


Dies ist die einzige Antwort, die sich bisher wirklich der Frage des OP nähert, dh was ein Bündel ist. stackoverflow.com/a/6236801/1588163 bietet weitere Einblicke.
Clapas

Warum ein Bundle verwenden, wenn wir nur ein Mapping verwenden können? Vielen Dank!
Ruchir Baronia

@RuchirBaronia Es gibt keinen besonderen Grund, ein Bundle zu verwenden, es sei denn, Sie beabsichtigen, es an einen Teil der Android-API zu übergeben, für den Bundle-Objekte erforderlich sind.
Scriptocalypse

8

Erstellen Sie einfach ein Bundle,


Bundle simple_bundle=new Bundle();
simple_bundle.putString("item1","value1");
Intent i=new Intent(getApplicationContext(),this_is_the_next_class.class);
i.putExtras(simple_bundle);
startActivity(i);

IN der "this_is_the_next_class.class"

Sie können die Elemente wie folgt abrufen.

Intent receive_i=getIntent();
Bundle my_bundle_received=receive_i.getExtras();
my_bundle_received.get("item1");
Log.d("Value","--"+my_bundle_received.get("item1").toString);

5

Bundle wird verwendet, um Daten zwischen Aktivitäten zu übertragen. Sie können ein Bundle erstellen und an Intent übergeben, das die Aktivität startet, die dann von der Zielaktivität aus verwendet werden kann.


3

Bundle: - Eine Zuordnung von String-Werten zu verschiedenen Parcelable-Typen.

Bundle wird im Allgemeinen zum Übertragen von Daten zwischen verschiedenen Aktivitäten von Android verwendet.

Wenn wir onPause () aufrufen, dann onStop () und dann in umgekehrter Reihenfolge onStop () zu onPause ().

Die gespeicherten Daten, die das System zum Wiederherstellen des vorherigen Status verwendet, werden als "Instanzstatus" bezeichnet und sind eine Sammlung von Schlüssel-Wert-Paaren, die in einem Bundle-Objekt gespeichert sind.


Ein Mapping ist die Art des Bündels.
BollMose

2

Das Bundle wird verwendet, um Daten zwischen Aktivitäten auszutauschen und den Status der App in der oncreate () -Methode zu speichern, damit die App weiß, wo sie gestoppt wurde ... Ich hoffe, es hilft :)


0

Verwendung von Bundle-Sendedaten von einer Aktivität zu einer anderen Aktivität mit Hilfe eines Intent-Objekts; Bundle enthält die Daten, die ein beliebiger Typ sein kann.

Jetzt erkläre ich, wie man Bundle-Passing-Daten zwischen zwei Aktivitäten erstellt.

Schritt 1: Bei der ersten Aktivität

Bundle b=new Bundle();

b.putString("mkv",anystring);

Intent in=new Intent(getApplicationContext(),secondActivity.class);

in.putExtras(b);

startActivity(in);

Schritt 2: Bei der zweiten Aktivität

Intent in=getIntent();

Bundle b=in.getExtras();

String s=b.getString("mkv");

Ich denke, das ist nützlich für dich ...........


0

Das Bundle dient nicht nur zum Übertragen von Daten zwischen zwei verschiedenen Komponenten, sondern vor allem zum Wiederherstellen der gespeicherten Werte, bevor die Aktivität in eine neue Aktivität umgewandelt wird.

wie der Text in einem EditTextWidget oder die Bildlaufposition von a ListView.


0

Erste Aktivität:

String food = (String)((Spinner)findViewById(R.id.food)).getSelectedItem();
RadioButton rb = (RadioButton) findViewById(R.id.rb);
Intent i = new Intent(this,secondActivity.class);
i.putExtra("food",food);
i.putExtra("rb",rb.isChecked());

Zweite Aktivität:

String food = getIntent().getExtras().getString("food");
Boolean rb = getIntent().getExtras().getBoolean("rb");

1
Möglicherweise möchten Sie auch mehr über minimale, vollständige und überprüfbare Beispiele erfahren .
Daniel Corzo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.