Was ist onCreate (Bundle savedInstanceState)


Antworten:


106

Wenn Sie den Status der Anwendung in einem Bundle speichern (normalerweise nicht persistente, dynamische Daten in onSaveInstanceState), kann er an zurückgegeben werden, onCreatewenn die Aktivität neu erstellt werden muss (z. B. Änderung der Ausrichtung), damit Sie diese nicht vorher verlieren Information. Wenn keine Daten angegeben wurden, savedInstanceStateist null.

... sollten Sie die onPause () -Methode verwenden, um persistente Daten (z. B. Benutzeränderungen) in den Speicher zu schreiben. Darüber hinaus wird die Methode onSaveInstanceState (Bundle) aufgerufen, bevor die Aktivität in einen solchen Hintergrundzustand versetzt wird. Auf diese Weise können Sie jeden dynamischen Instanzstatus in Ihrer Aktivität in dem angegebenen Bundle speichern und später in onCreate (Bundle) empfangen, wenn die Aktivität erfolgt muss neu erstellt werden. Weitere Informationen dazu, wie der Lebenszyklus eines Prozesses an die von ihm gehosteten Aktivitäten gebunden ist, finden Sie im Abschnitt Prozesslebenszyklus. Beachten Sie, dass es wichtig ist, persistente Daten in onPause () anstelle von onSaveInstanceState (Bundle) zu speichern, da letzteres nicht Teil der Lifecycle-Rückrufe ist und daher nicht in jeder Situation aufgerufen wird, wie in der Dokumentation beschrieben.

Quelle


2
Teilen andere Aktivitäten dasselbe Bundle? Wenn ich eine andere Aktivität starte, besteht sie das Bundle von der ersten?
Francisco Corrales Morales

17

onCreate(Bundle savedInstanceState)Sie erhalten die BundleNull, wenn die Aktivität zum ersten Mal gestartet wird, und sie wird verwendet, wenn die Aktivitätsorientierung geändert wird .......

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

Android bietet eine weitere elegante Möglichkeit, dies zu erreichen. Um dies zu erreichen, müssen wir eine aufgerufene Methode überschreiben onSaveInstanceState(). Mit der Android-Plattform können Benutzer jeden Instanzstatus speichern. Der Instanzstatus kann im Bundle gespeichert werden. Das Bundle wird als Argument an die onSaveInstanceState-Methode übergeben.

Wir können den Status der gespeicherten Instanz aus dem Bundle laden, das als Argument an die onCreateMethode übergeben wurde. Wir können den gespeicherten Instanzstatus auch in onRestoreInstanceStatemethod laden . Aber das überlasse ich den Lesern.


11
savedInstanceStatewird nicht sein, nullwenn onSavedInstanceState()zuvor aufgerufen wurde. Orientierungsänderungen sind nur ein Beispiel, in dem dies auftreten kann.
Alex Lockwood

1
@AlexLockwood, ich versuche an alle Situationen zu denken, in denen dies auftreten könnte. Gibt es Unterlagen? Eine Instanz, an die ich denken kann, ist, wenn der Benutzer Apps wechselt und zurückkommt, die Aktivität jedoch für die Wiederherstellung von Ressourcen zerstört wurde. In diesem Fall erstellt Android die Aktivität mit einem Bundle neu, wenn onSaveInsanceState () überschrieben wurde, oder?
Batbrat

1
@batbrat Ja ... der Kommentar, den ich (vor fast zwei Jahren) gemacht habe, ist nicht ganz richtig. Ich denke , der beste Weg , um es das ist BundleArgument onCreate(Bundle)wird nicht sein , nullwenn und nur wenn die Activityes der hatte onSaveInstanceStateMethode zuvor genannt. Dies geschieht während Orientierungsänderungen ... und auch, wenn die Aktivität nach dem Beenden durch das Betriebssystem zurückkehrt und wenn Sie eine andere interessierende Konfigurationsänderung auf Ihrem Gerät auslösen.
Alex Lockwood

Danke für die Klarstellung Alex. Es ist gut, Klarheit über das Thema zu haben. Ich hatte andere Konfigurationsänderungen als insbesondere Orientierungsschalter vergessen.
Batbrat

15

Wie Dhruv Gairola antwortete, können Sie den Status der Anwendung mithilfe von Bundle savedInstanceState speichern. Ich versuche ein sehr einfaches Beispiel zu geben, das neue Lernende wie ich leicht verstehen können.

Angenommen, Sie haben ein einfaches Fragment mit einer Textansicht und einer Schaltfläche. Jedes Mal, wenn Sie auf die Schaltfläche klicken, ändert sich der Text. Ändern Sie nun die Ausrichtung Ihres Geräts / Emulators und stellen Sie fest, dass Sie die Daten verloren haben (dh die geänderten Daten nach dem Klicken) und das Fragment beginnt beim ersten Mal erneut. Durch die Verwendung von Bundle savedInstanceState können wir dies beseitigen. Wenn Sie einen Blick in den Lebensstil des Fragments werfen. Fragment Lifecylce Sie erhalten, dass eine Methode "onSaveInstanceState" aufgerufen wird, wenn das Fragment zerstört werden soll.

Wir können also den Status speichern, dh den geänderten Textwert in diesem Bundle wie folgt

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

Nachdem Sie die Ausrichtung vorgenommen haben, wird die Methode "onCreate" aufgerufen, oder? also können wir das einfach machen

@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
    }
}

Jetzt verlieren Sie Ihren Wert nach der Orientierung nicht mehr. Der geänderte Wert wird immer angezeigt.


Beachten Sie, dass dies auch für Aktivitäten gilt. Können Sie den Unterschied zwischen (Aktivitätsbündel) und Fragmentbündel näher erläutern?
Laalaguer

Sie können ein klares Verständnis aus den Lebenszyklen von Aktivität und Fragment erhalten, in denen eine Aktivität mehrere Fragmente gleichzeitig anzeigen kann. Der grundlegende Unterschied besteht also darin, dass Sie möglicherweise einige Werte für alle Fragmente einer Aktivität speichern möchten Verwenden Sie das Aktivitätsbündel, andernfalls sollten Sie ein Fragmentbündel verwenden, wenn es sich um ein bestimmtes Fragment handelt.
Asad

5

onCreate (Bundle savedInstanceState) Funktion in Android:

1) Wenn eine Aktivität zum ersten Mal aufgerufen oder gestartet wird, ist die Methode onCreate (Bundle savedInstanceState) für die Erstellung der Aktivität verantwortlich.

2) Wenn die Ausrichtung (dh von horizontal nach vertikal oder vertikal nach horizontal) der Aktivität geändert wird oder wenn eine Aktivität von einem Betriebssystem gewaltsam beendet wird, speichert savedInstanceState, dh das Objekt der Bundle-Klasse, den Status einer Aktivität.

3) Nachdem die Ausrichtung geändert wurde, ruft onCreate (Bundle savedInstanceState) die Aktivität auf, erstellt sie neu und lädt alle Daten aus savedInstanceState.

4) Grundsätzlich wird die Bundle-Klasse verwendet, um die Aktivitätsdaten zu speichern, wenn die oben genannten Bedingungen in der App auftreten.

5) onCreate () ist für Apps nicht erforderlich. Der Grund, warum es in der App verwendet wird, ist, dass diese Methode der beste Ort ist, um Initialisierungscode einzufügen.

6) Sie können Ihren Initialisierungscode auch in onStart () oder onResume () einfügen. Wenn Ihre App zuerst geladen wird, funktioniert sie genauso wie in onCreate ().


4

onCreate(Bundle)wird aufgerufen, wenn die Aktivität zum ersten Mal gestartet wird. Sie können es verwenden, um eine einmalige Initialisierung durchzuführen, z. B. das Erstellen der Benutzeroberfläche. onCreate()Nimmt einen Parameter, der entweder null ist, oder einige Statusinformationen, die zuvor von der gespeichert wurden onSaveInstanceState.


0

onCreate (Bundle savedInstanceState) wird aufgerufen und savedInstanceState ist nicht null, wenn Ihre Aktivität in einem oben beschriebenen Szenario (visuelle Ansicht) beendet wurde. Ihre App kann dann die Daten von savedInstanceState abrufen (abfangen) und Ihre Aktivität neu generieren

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.