Cosa c'è suCreate (Bundle savedInstanceState)


Risposte:


106

Se salvi lo stato dell'applicazione in un bundle (in genere dati dinamici non persistenti in onSaveInstanceState), può essere ritrasmesso onCreatese l'attività deve essere ricreata (ad esempio, cambio di orientamento) in modo da non perderlo prima informazione. Se non sono stati forniti dati, savedInstanceStateè nullo.

... dovresti usare il metodo onPause () per scrivere tutti i dati persistenti (come le modifiche dell'utente) nella memoria. Inoltre, il metodo onSaveInstanceState (Bundle) viene chiamato prima di posizionare l'attività in tale stato in background, consentendo di salvare qualsiasi stato dell'istanza dinamica nella tua attività nel Bundle dato, per essere successivamente ricevuto in onCreate (Bundle) se l'attività deve essere ricreato. Vedere la sezione Ciclo di vita del processo per ulteriori informazioni su come il ciclo di vita di un processo è legato alle attività che ospita. Si noti che è importante salvare i dati persistenti in onPause () anziché in onSaveInstanceState (Bundle) perché quest'ultimo non fa parte dei callback del ciclo di vita, quindi non verrà chiamato in ogni situazione come descritto nella sua documentazione.

fonte


2
altre attività condividono lo stesso pacchetto?, se inizio un'altra attività, passa il pacchetto dalla prima?
Francisco Corrales Morales

17

onCreate(Bundle savedInstanceState)si otterrà il valore Bundlenullo quando l'attività inizia per la prima volta e verrà utilizzato quando l'orientamento dell'attività viene modificato ...

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

Android offre un altro modo elegante per raggiungere questo obiettivo. Per ottenere ciò, dobbiamo sovrascrivere un metodo chiamato onSaveInstanceState(). La piattaforma Android consente agli utenti di salvare qualsiasi stato dell'istanza. Lo stato dell'istanza può essere salvato nel bundle. Il bundle viene passato come argomento al metodo onSaveInstanceState.

possiamo caricare lo stato dell'istanza salvata dal bundle passato come argomento al onCreatemetodo. Possiamo anche caricare lo stato dell'istanza salvata in onRestoreInstanceStatemethod. Ma lascerò che lo capiscano i lettori.


11
savedInstanceStatesarà non nullse è onSavedInstanceState()stato precedentemente chiamato. i cambiamenti di orientamento sono solo un esempio in cui ciò potrebbe verificarsi.
Alex Lockwood

1
@AlexLockwood, sto cercando di pensare a tutte le situazioni in cui ciò potrebbe verificarsi. C'è documentazione? Un caso a cui riesco a pensare è se l'utente cambia app e torna indietro, ma l'attività è stata distrutta per il recupero delle risorse. In questo caso, Android ricrea l'attività con un bundle se onSaveInsanceState () è stato sovrascritto, giusto?
batbrat

1
@batbrat Sì ... il commento che ho fatto (quasi due anni fa) non è del tutto corretto. Credo che il modo migliore per mettere è l' Bundleargomento onCreate(Bundle)sarà non nullse e solo se il Activityfatto il suo onSaveInstanceStatemetodo chiamato in precedenza. Ciò accade durante i cambiamenti di orientamento ... e accade anche quando l'attività ritorna dopo essere stata interrotta dal sistema operativo e quando si attiva qualsiasi altra modifica di configurazione di interesse sul dispositivo.
Alex Lockwood

Grazie per il chiarimento Alex. È bene avere un po 'di chiarezza sull'argomento. Mi ero dimenticato delle modifiche alla configurazione diverse dagli interruttori di orientamento in particolare.
batbrat

15

Come ha risposto Dhruv Gairola, puoi salvare lo stato dell'applicazione utilizzando Bundle savedInstanceState. Sto cercando di fornire un esempio molto semplice che i nuovi studenti come me possano capire facilmente.

Supponiamo di avere un semplice frammento con TextView e Button. Ogni volta che si fa clic sul pulsante, il testo cambia. Ora, cambia l'orientamento del tuo dispositivo / emulatore e nota che hai perso i dati (significa che i dati modificati dopo aver fatto clic su ottenuto) e il frammento ricomincia come la prima volta. Usando Bundle savedInstanceState possiamo sbarazzarci di questo. Se dai un'occhiata al ciclo di vita del frammento. Fragment Lifecylce vedrai che un metodo "onSaveInstanceState" viene chiamato quando il frammento sta per essere distrutto.

Quindi, possiamo salvare lo stato significa che il valore del testo modificato in quel pacchetto in questo modo

 int counter  = 0;
 @Override
 public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("value",counter);
 }

Dopo aver effettuato l'orientamento, il metodo "onCreate" verrà chiamato giusto? quindi possiamo solo farlo

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState == null){
        //it is the first time the fragment is being called
        counter = 0;
    }else{
        //not the first time so we will check SavedInstanceState bundle
        counter = savedInstanceState.getInt("value",0); //here zero is the default value
    }
}

Ora, non perderai il tuo valore dopo l'orientamento. Il valore modificato verrà sempre visualizzato.


Si noti che questo vale anche per l'attività. Puoi spiegare di più sulla differenza tra (Bundle of Activity) e Bundle of Fragment?
laalaguer

È possibile ottenere una chiara comprensione dei cicli di vita di attività e frammenti in cui un'attività può visualizzare più frammenti alla volta.Quindi, la differenza fondamentale è che potresti voler salvare alcuni valori per tutti i frammenti di un'attività, quindi lo farai usa il bundle of activity altrimenti dovresti usare bundle of fragment se è per un frammento specifico.
Assad

5

Funzione onCreate (Bundle savedInstanceState) in Android:

1) Quando un'attività chiama per la prima volta o viene avviata, il metodo onCreate (Bundle savedInstanceState) è responsabile della creazione dell'attività.

2) Ogni volta che l'orientamento (cioè da orizzontale a verticale o da verticale a orizzontale) dell'attività viene modificato o quando un'attività viene terminata con forza da qualsiasi sistema operativo, allora saveInstanceState, ovvero l'oggetto della Bundle Class, salverà lo stato di un'attività.

3) Dopo la modifica dell'orientamento, onCreate (Bundle savedInstanceState) chiamerà e ricrea l'attività e caricherà tutti i dati da savedInstanceState.

4) Fondamentalmente la classe Bundle viene utilizzata per memorizzare i dati dell'attività ogni volta che la condizione di cui sopra si verifica nell'app.

5) onCreate () non è richiesto per le app. Ma il motivo per cui viene utilizzato nell'app è perché quel metodo è il posto migliore in cui inserire il codice di inizializzazione.

6) Puoi anche mettere il tuo codice di inizializzazione in onStart () o onResume () e quando l'app verrà caricata per prima, funzionerà come in onCreate ().


4

onCreate(Bundle)viene chiamato quando l'attività inizia per la prima volta. È possibile utilizzarlo per eseguire un'inizializzazione una tantum come la creazione dell'interfaccia utente. onCreate()accetta un parametro che è nullo o alcune informazioni di stato precedentemente salvate da onSaveInstanceState.


0

onCreate (Bundle savedInstanceState) viene chiamato e savedInstanceState sarà non nullo se la tua attività è stata terminata in uno scenario (visualizzazione visiva) descritto sopra. La tua app può quindi acquisire (catturare) i dati da savedInstanceState e rigenerare la tua attività

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.