super.onCreate (savedInstanceState);

88

Ich habe ein Android-Anwendungsprojekt erstellt und in MainActivity.java> onCreate()ruft es auf super.onCreate(savedInstanceState).

Kann jemand als Anfänger erklären, was der Zweck der obigen Zeile ist?

Pramod
quelle

Antworten:

158

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

Jede Ihrer Aktivitäten wird android.app.Activityentweder direkt oder durch Unterklasse einer anderen Unterklasse von erweitert Activity.

Wenn Sie in Java von einer Klasse erben, können Sie deren Methoden überschreiben, um Ihren eigenen Code darin auszuführen. Ein sehr häufiges Beispiel hierfür ist das Überschreiben 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 Aufrufen weisen super.onCreate(savedInstanceState);Sie die Dalvik-VM an, Ihren Code zusätzlich zum vorhandenen Code in onCreate () der übergeordneten Klasse auszuführen. Wenn Sie diese Zeile weglassen, wird nur Ihr Code ausgeführt. Der vorhandene Code wird vollständig ignoriert.

Sie müssen diesen Superaufruf jedoch in Ihre Methode aufnehmen, denn wenn Sie dies nicht tun, wird der onCreate()Code in Activitynie ausgeführt, und Ihre App wird auf alle möglichen Probleme stoßen, z. B. wenn der Aktivität kein Kontext zugewiesen wird (obwohl Sie darauf stoßen a SuperNotCalledExceptionbevor Sie die Chance haben herauszufinden, dass Sie keinen Kontext haben).

Kurz gesagt, die eigenen Klassen von Android können unglaublich komplex sein. Der Code in den Framework-Klassen behandelt Dinge wie das Zeichnen von Benutzeroberflächen, das Reinigen von Häusern und das Verwalten des Aktivitäts- und Anwendungslebenszyklus. superAufrufe ermöglichen es Entwicklern, diesen komplexen Code hinter den Kulissen auszuführen und gleichzeitig ein gutes Abstraktionsniveau für unsere eigenen Apps bereitzustellen.

Raghav Sood
quelle
2
Noch eine Frage: Wenn wir die übergeordnete Klassenmethode überschreiben, enthält diese abgeleitete Methode dann noch den Code der übergeordneten Klassenmethode, oder handelt es sich um eine neue neue Methode?
Pramod
15
Wenn Sie super aufrufen, wird der Code der übergeordneten Methode dort abgelegt, wo sich der super-Aufruf befindet. Wenn super nicht aufgerufen wird, ist es eine neue Methode.
Raghav Sood
2
Raghav Sood, ich denke, Sie sollten Ihren Kommentartext zur Antwort hinzufügen, da er die Verwendung der Super-Methode für Anfänger verständlicher erklärt. Zumindest habe ich es nur aus Ihrem Kommentar verstanden :)
Ayaz Alifov
5

* Die abgeleitete Klassenmethode onCreate(bundle)muss die Implementierung dieser Methode in der Oberklasse aufrufen. Es wird eine Ausnahme SuperNotCalledException ausgelöst, wenn das Schlüsselwort " super " nicht verwendet wird.

JavaVerwenden Sie super.methodname()für die Vererbung in , um die Oberklassenmethode zu überschreiben und auch die obige Klassenmethode auszuführen, die überschriebene abgeleitete Klassenmethode.

Die Android-Klasse funktioniert genauso. Verwenden Sie das Super-Schlüsselwort mit der Methode onCreate () like, indem Sie die ActivityKlasse mit einer onCreate(Bundle bundle)Methode erweitern, in der aussagekräftiger Code geschrieben ist, und diesen Code in der definierten Aktivität ausführen super.onCreate(bundle).

Dies ist ein Code, der in der Aktivitätsklassenmethode geschrieben wurde onCreate(), und das Android Dev-Team fügt dieser Methode möglicherweise später einen aussagekräftigeren Code hinzu. Um die Ergänzungen wiederzugeben , sollten Sie die Datei super.onCreate () in Ihrer ActivityKlasse aufrufen .

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.
 */

Außerdem wird die Variable beibehalten, mCalledwas bedeutet, dass Sie die super.onCreate(savedBundleInstance)in Ihrer Aktivität aufgerufen haben .

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

Ajay S.
quelle
1

Weil es bei super.onCreate () die Activity-Klasse (übergeordnete Klasse einer Aktivität) erreicht, um den savedInstanceState zu laden, und wir normalerweise keinen gespeicherten Instanzstatus festlegen, aber das Android-Framework so erstellt hat, dass wir aufrufen sollten Das.

Govil
quelle
Ihr Code wird glücklich kompiliert, auch wenn Sie nicht anrufen super.onCreate(savedInstanceState), es sei denn, Sie haben einen anderen Fehler darin
Raghav Sood
1

Es handelt sich um Informationen, die Sie über onCreate () an Ihre Anwendung zurückgeben möchten, wenn die Aktivität aus einem impliziten Grund zerstört und neu gestartet wird (z. B. nicht, weil der Benutzer die Zurück-Taste gedrückt hat). Die häufigste Verwendung von onSaveInstanceState () ist die Verarbeitung von Bildschirmdrehungen, da Aktivitäten standardmäßig zerstört und neu erstellt werden, wenn der Benutzer die G1-Tastatur herauszieht.

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

M_ Fa
quelle