Frage super.onCreate (savedInstanceState);


Als Neuling habe ich eine sehr grundlegende Frage: Ich habe ein Android-Anwendungsprojekt in Eclipse erstellt, in MainActivity.java> onCreate() es ruft an super.onCreate(savedInstanceState).

Kann jemand erklären, was der Zweck von über Linie ist?


75
2018-02-03 11:19


Ursprung


Antworten:


Jede Aktivität, die Sie ausführen, wird durch eine Reihe von Methodenaufrufen gestartet. onCreate() ist der erste dieser Anrufe.

Jede einzelne Ihrer Aktivitäten erstreckt sich auf Sie android.app.Activity entweder direkt oder durch Unterklassenbildung einer anderen Unterklasse von Activity.

Wenn Sie in Java von einer Klasse erben, können Sie deren Methoden überschreiben, um darin Ihren eigenen Code auszuführen. Ein sehr häufiges Beispiel hierfür ist das Übersteuern der toString() Methode beim Erweitern java.lang.Object.

Wenn wir eine Methode überschreiben, haben wir die Möglichkeit, die Methode in unserer Klasse vollständig zu ersetzen oder die Methode der vorhandenen übergeordneten Klasse zu erweitern. Durch Anruf super.onCreate(savedInstanceState);Sagen Sie der Dalvik-VM, dass sie Ihren Code ausführen soll in Ergänzung zu dem vorhandenen Code in der onCreate () der Elternklasse. Wenn Sie diese Zeile weglassen, dann nur dein Code es läuft. Der vorhandene Code wird vollständig ignoriert.

Sie müssen diesen Superaufruf jedoch in Ihre Methode aufnehmen, denn wenn Sie dies nicht tun, dann wird der onCreate() Code ein Activity wird nie ausgeführt, und Ihre App wird auf alle möglichen Probleme stoßen, wenn der Aktivität kein Kontext zugewiesen ist (obwohl Sie eine SuperNotCalledException bevor Sie eine Chance haben, herauszufinden, dass Sie keinen Kontext haben).

Kurz gesagt, Androids eigene Klassen können unglaublich komplex sein. Der Code in den Framework-Klassen behandelt Dinge wie das Zeichnen von Benutzeroberflächen, die Hausreinigung und die Pflege des Aktivitäts- und Anwendungslebenszyklus. super Aufrufe ermöglichen es Entwicklern, diesen komplexen Code hinter den Kulissen auszuführen und gleichzeitig eine gute Abstraktionsebene für unsere eigenen Apps bereitzustellen.


140
2018-02-03 11:30



*Abgeleitete Klasse onCreate(bundle) Methode muss die Superklassenimplementierung dieser Methode aufrufen. Es wird eine Ausnahme ausgelöst SuperNotCalledException wenn der "Super"Keyword wird nicht verwendet.

Für die Vererbung in JavaUm die Superklassenmethode zu überschreiben und auch die obige Klassenmethode auszuführen, verwenden Sie super.methodname() in der übergeordneten abgeleiteten Klassenmethode;

Android-Klasse funktioniert auf die gleiche Weise. Durch die Verlängerung der Activity Klasse, die haben onCreate(Bundle bundle) Methode, in der aussagekräftiger Code geschrieben wird und diesen Code in der definierten Aktivität ausführt, verwenden Sie das Schlüsselwort super mit der Methode onCreate () like super.onCreate(bundle).

Dies ist ein in der Aktivitätsklasse geschriebener Code onCreate() Die Methode und das Android Dev-Team könnten dieser Methode später einen aussagekräftigeren Code hinzufügen. Also, um die Ergänzungen zu reflektieren, sollten Sie die anrufen super.onCreate () in deinem Activity Klasse.

protected void  onCreate(Bundle savedInstanceState) {
    mVisibleFromClient = mWindow.getWindowStyle().getBoolean(
    com.android.internal.R.styleable.Window_windowNoDisplay, true);
    mCalled = true;
}

boolean mVisibleFromClient = true;

/**
 * Controls whether this activity main window is visible.  This is intended
 * only for the special case of an activity that is not going to show a
 * UI itself, but can't just finish prior to onResume() because it needs
 * to wait for a service binding or such.  Setting this to false prevents the UI from being shown during that time.
 * 
 * <p>The default value for this is taken from the
 * {@link android.R.attr#windowNoDisplay} attribute of the activity's theme.
 */

Es behält auch die Variable bei mCalled was bedeutet, dass Sie die aufgerufen haben super.onCreate(savedBundleInstance) in deiner Aktivität

final void performStart() {
    mCalled = false;
    mInstrumentation.callActivityOnStart(this);
    if (!mCalled) {
        throw new SuperNotCalledException(
            "Activity " + mComponent.toShortString() +
            " did not call through to super.onStart()");
    }
}

Siehe Quellcode hier.

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/app/Activity.java#Activity.onCreate%28android.os.Bundle%29


4
2018-02-03 11:29



Denn mit super.onCreate () erreicht es die Klasse Activity (Elternklasse jeder Aktivität), um den savedInstanceState zu laden, und normalerweise setzen wir keinen gespeicherten Instanzzustand, sondern Android Framework so gemacht, dass wir das nennen sollten.


1
2018-02-03 11:33



Es sind Informationen, die Sie über onCreate () in Ihre Anwendung zurückgeben möchten. wenn die Aktivität aufgrund eines impliziten Grundes zerstört und neu gestartet wird (z. B. nicht, weil der Benutzer den Zurück-Knopf gedrückt hat). Das Üblichste Die Verwendung von onSaveInstanceState () soll Bildschirmdrehungen wie durch behandeln Standardmäßig werden Aktivitäten zerstört und neu erstellt, wenn der Benutzer aus dem System verschwindet die G1-Tastatur.

Der Grund für den Aufruf von super.onCreate (savedInstanceState) liegt darin, dass Sie Code wird sonst nicht kompiliert. ;-)


1
2017-07-15 17:32