super.onCreate (SavedInstanceState);


88

He creado un proyecto de aplicación de Android y en MainActivity.java> onCreate()está llamando super.onCreate(savedInstanceState).

Como principiante, ¿alguien puede explicar cuál es el propósito de la línea anterior?

Respuestas:


159

Cada actividad que realiza se inicia mediante una secuencia de llamadas a métodos. onCreate()es la primera de estas llamadas.

Todas y cada una de sus Actividades se extienden android.app.Activitydirectamente o subclasificando otra subclase de Activity.

En Java, cuando hereda de una clase, puede anular sus métodos para ejecutar su propio código en ellos. Un ejemplo muy común de esto es la invalidación del toString()método al extender java.lang.Object.

Cuando anulamos un método, tenemos la opción de reemplazar completamente el método en nuestra clase, o de extender el método de la clase padre existente. Al llamar super.onCreate(savedInstanceState);, le dice a la VM Dalvik que ejecute su código además del código existente en onCreate () de la clase principal. Si omite esta línea, solo se ejecutará su código . El código existente se ignora por completo.

Sin embargo, debe incluir esta súper llamada en su método, porque si no lo hace, el onCreate()código Activitynunca se ejecutará y su aplicación se encontrará con todo tipo de problemas, como no tener un contexto asignado a la actividad (aunque presionará una SuperNotCalledExceptionantes de tener la oportunidad de darse cuenta de que usted no tiene ningún contexto).

En resumen, las clases propias de Android pueden ser increíblemente complejas. El código en las clases del marco maneja cosas como el dibujo de la interfaz de usuario, la limpieza de la casa y el mantenimiento de la actividad y los ciclos de vida de la aplicación. superLas llamadas permiten a los desarrolladores ejecutar este código complejo entre bastidores, sin dejar de ofrecer un buen nivel de abstracción para nuestras propias aplicaciones.


2
una pregunta más: cuando anulamos el método de la clase principal, ¿este método derivado todavía contiene el código del método de la clase principal, o es un nuevo método nuevo?
Pramod

15
Si llama a super, el código del método padre se coloca donde está la super llamada. Si no se llama super, es un método nuevo.
Raghav Sood

2
Raghav Sood, creo que debería agregar el texto de su comentario a la respuesta, ya que explica el uso del súper método de manera más comprensible para los principiantes. Al menos lo entendí solo por tu comentario :)
Ayaz Alifov

5

* El onCreate(bundle)método de clase derivado debe llamar a la implementación de superclase de este método. Lanzará una excepción SuperNotCalledException si no se utiliza la palabra clave " super ".

Para herencia en Java, para anular el método de superclase y también para ejecutar el método de clase anterior, utilice super.methodname()en el método de clase derivada anulante;

La clase de Android funciona de la misma manera. Al extender la Activityclase que tiene un onCreate(Bundle bundle)método en el que se escribe código significativo y ejecutar ese código en la actividad definida, use la palabra clave super con el método onCreate () like super.onCreate(bundle).

Este es un código escrito en el onCreate()método de la clase Activity y el equipo de desarrollo de Android podría agregar más código significativo a este método más adelante. Entonces, para reflejar las adiciones, se supone que debe llamar a super.onCreate () en su Activityclase.

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

También mantiene la variable, lo mCalledque significa que ha llamado super.onCreate(savedBundleInstance)en su Actividad.

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

Vea el código fuente aquí.

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


1

Porque sobre super.onCreate () llegará a la clase Activity (clase principal de cualquier actividad) para cargar el SavedInstanceState, y normalmente no establecemos ningún estado de instancia guardado, pero el marco de Android se hizo de tal manera que deberíamos llamar ese.


Su código se compilará felizmente incluso si no llama super.onCreate(savedInstanceState), a menos que tenga algún otro error en él
Raghav Sood

1

Es información que desea que se devuelva a su aplicación, a través de onCreate (), si la actividad se destruye y se reinicia debido a alguna razón implícita (por ejemplo, no porque el usuario presionó el botón Atrás). El uso más común de onSaveInstanceState () es manejar las rotaciones de pantalla, ya que, de forma predeterminada, las actividades se destruyen y se recrean cuando el usuario desliza el teclado G1.

La razón para llamar a super.onCreate (SavedInstanceState) es porque su código no se compilará de otra manera. ;-)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.