Che cos'è un "bundle" in un'applicazione Android


Risposte:


279

I pacchetti vengono generalmente utilizzati per il passaggio di dati tra varie attività Android. Dipende da te quale tipo di valori vuoi passare, ma i bundle possono contenere tutti i tipi di valori e passarli alla nuova attività.

Puoi usarlo in questo modo:

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

Puoi ottenere i valori passati facendo:

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

Puoi trovare maggiori informazioni su:


3
perché non usare direttamente System.object e il cast?
Prole ama il

79

Passa i dati tra le attività usando Bundlee Intentoggetti.


Il tuo primo creare un Bundleoggetto

Bundle b = new Bundle();

Quindi, associa i dati della stringa memorizzati nella anystringchiave bundle"myname"

b.putString("myname", anystring);

Ora crea un Intentoggetto

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

Passa l'oggetto bundle ball'intento

in.putExtras(b);

e inizia la seconda attività

startActivity(in);

Nella seconda attività, dobbiamo accedere ai dati passati dalla prima attività

Intent in = getIntent();

Ora, è necessario ottenere i dati dal pacchetto

Bundle b = in.getExtras();

Infine, ottieni il valore dei dati della stringa associati alla chiave denominata "myname"

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

QUESTA È VERAMENTE UNA BUONA RISPOSTA, GRAZIE PER QUELLO.
Abhishek Garg,

68

Devo aggiungere che i pacchetti vengono utilizzati dalle attività per trasmettere i dati a se stessi in futuro.

Quando lo schermo ruota o quando viene avviata un'altra attività, il metodo protected void onSaveInstanceState(Bundle outState)viene invocato e l'attività viene distrutta. Successivamente, viene creata un'altra istanza dell'attività e public void onCreate(Bundle savedInstanceState)viene chiamata. Quando viene creata la prima istanza di attività, il pacchetto è nullo; e se il bundle non è nullo, l'attività continua alcune attività avviate dal suo predecessore.

Android salva automaticamente il testo nei campi di testo, ma non salva tutto e talvolta compaiono bug sottili.

L'anti-pattern più comune, tuttavia, sta assumendo che onCreate()esegua solo l'inizializzazione. È sbagliato, perché deve anche ripristinare lo stato.

Esiste un'opzione per disabilitare questo comportamento "ricrea attività sulla rotazione", ma non impedirà i bug relativi al riavvio, ma renderà più difficile menzionarli.

Si noti inoltre che l'unico metodo la cui chiamata è garantita quando l'attività verrà distrutta è onPause(). (Vedi il grafico del ciclo di vita delle attività nei documenti.)


Perché usare un bundle se possiamo semplicemente usare una mappatura? Grazie Ted!
Ruchir Baronia,

4
Il pacchetto non viene utilizzato solo dall'attività. Viene anche utilizzato da Frammento per preservare gli stati dopo la rotazione.
Kai Wang,

48

A Bundleè molto simile a un Mapoggetto Java che associa le Stringchiavi ai valori. Viene utilizzato per trasferire informazioni tra attività e altri componenti dell'applicazione. Viene anche utilizzato dal framework per acquisire e ripristinare le informazioni sullo stato.

Il motivo per cui Android non usa semplici Mapoggetti vecchi per questo è che Mapè troppo flessibile; può contenere oggetti (come, ad esempio, flussi I / O) che non possono essere serializzati. L' BundleAPI limita i tipi di oggetti che possono essere aggiunti a un pacchetto in modo tale che i contenuti del pacchetto siano garantiti come serializzabili. Il framework Android si basa su questa proprietà.

Ti suggerisco di leggere la documentazione sui Fondamenti dell'applicazione . Questo spiega, tra le altre cose, cosa sono i fasci e le intenzioni e a cosa servono.


14

I pacchetti possono essere utilizzati per inviare dati arbitrari da un'attività all'altra tramite Intenti. Quando si trasmette un Intento, le Attività interessate (e altri BroadcastRecievers) verranno informati di ciò. Un intento può contenere un pacchetto in modo da poter inviare dati aggiuntivi insieme all'intento.

I bundle sono mapping di valori-chiave, quindi in un certo senso sono come un hash, ma non sono strettamente limitati a un singolo mapping di oggetti String / Foo. Si noti che solo alcuni tipi di dati sono considerati "Parcelable" e sono esplicitamente indicati nell'API Bundle.


Questa è l'unica risposta finora per affrontare davvero la domanda del PO, ovvero cos'è un pacchetto. stackoverflow.com/a/6236801/1588163 fornisce ulteriori approfondimenti.
Clapas,

Perché usare un bundle se possiamo semplicemente usare una mappatura? Grazie!
Ruchir Baronia,

@RuchirBaronia non vi è alcun motivo speciale per utilizzare un pacchetto a meno che non si intenda passarlo a una parte dell'API Android che richiede oggetti pacchetto.
scriptocalypse,

8

Basta creare un pacchetto,


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 "this_is_the_next_class.class"

È possibile recuperare gli elementi in questo modo.

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

Il pacchetto viene utilizzato per trasferire dati tra le attività. È possibile creare un pacchetto, passarlo a Intento che avvia l'attività che può quindi essere utilizzata dall'attività di destinazione.


3

Bundle: - Una mappatura dai valori String ai vari tipi Parcelable.

Il bundle viene generalmente utilizzato per il passaggio di dati tra varie attività di Android.

quando chiamiamo onPause () quindi onStop () e poi in ordine inverso onStop () a onPause ().

I dati salvati che il sistema utilizza per ripristinare lo stato precedente è chiamato "stato dell'istanza" ed è una raccolta di coppie chiave-valore archiviate in un oggetto Bundle.


Una mappatura è la natura del pacchetto.
BollMose

2

il bundle viene utilizzato per condividere i dati tra le attività e per salvare lo stato dell'app nel metodo oncreate () in modo che l'app venga a sapere dove è stata interrotta ... Spero che aiuti :)


0

l'uso del bundle invia i dati da un'attività all'altra con l'aiuto di intent object; Il pacchetto contiene i dati che possono essere di qualsiasi tipo.

Ora dico come creare un bundle passando i dati tra due attività.

Passaggio 1: alla prima attività

Bundle b=new Bundle();

b.putString("mkv",anystring);

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

in.putExtras(b);

startActivity(in);

Passaggio 2: sulla seconda attività

Intent in=getIntent();

Bundle b=in.getExtras();

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

Penso che questo sia utile per te ...........


0

Il bundle non è solo per trasferire dati tra due diversi componenti, ma soprattutto è usato per ripristinare i valori memorizzati prima che l'attività venga distrutta in una nuova attività.

come il testo in un EditTextwidget o la posizione di scorrimento di a ListView.


0

Prima attività:

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

Seconda attività:

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

1
Potresti anche voler conoscere esempi minimi, completi e verificabili .
Daniel Corzo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.