super.onCreate (savedInstanceState);


88

Ho creato un progetto di applicazione Android e in MainActivity.java> onCreate() sta chiamando super.onCreate(savedInstanceState).

Come principiante, qualcuno può spiegare qual è lo scopo della riga sopra?

Risposte:


159

Ogni attività che fai viene avviata tramite una sequenza di chiamate di metodo. onCreate()è la prima di queste chiamate.

Ciascuna delle tue attività si estende android.app.Activitydirettamente o sottoclasse un'altra sottoclasse di Activity.

In Java, quando si eredita da una classe, è possibile sovrascrivere i suoi metodi per eseguire il proprio codice in essi. Un esempio molto comune di questo è l'override del toString()metodo durante l'estensione java.lang.Object.

Quando sovrascriviamo un metodo, abbiamo la possibilità di sostituire completamente il metodo nella nostra classe o di estendere il metodo della classe genitore esistente. Chiamando super.onCreate(savedInstanceState);, dici alla VM Dalvik di eseguire il tuo codice in aggiunta al codice esistente in onCreate () della classe genitore. Se ometti questa riga, solo il tuo codice viene eseguito . Il codice esistente viene ignorato completamente.

Tuttavia, devi includere questa super chiamata nel tuo metodo, perché se non lo fai, il onCreate()codice Activitynon viene mai eseguito e la tua app si imbatterà in tutti i tipi di problemi come non avere alcun contesto assegnato all'attività (anche se premi a SuperNotCalledExceptionprima che tu abbia la possibilità di capire che non hai contesto).

In breve, le classi di Android possono essere incredibilmente complesse. Il codice nelle classi del framework gestisce cose come il disegno dell'interfaccia utente, la pulizia della casa e il mantenimento dell'attività e dei cicli di vita dell'applicazione. superle chiamate consentono agli sviluppatori di eseguire questo codice complesso dietro le quinte, fornendo comunque un buon livello di astrazione per le nostre app.


2
ancora una domanda: quando sovrascriviamo il metodo della classe genitore, questo metodo derivato mantiene ancora il codice del metodo della classe genitore o è un nuovo metodo nuovo?
Pramod

15
Se chiami super, il codice del metodo genitore viene inserito dove si trova la chiamata super. Se super non viene chiamato, è un metodo nuovo.
Raghav Sood

2
Raghav Sood, penso che dovresti aggiungere il testo del tuo commento alla risposta poiché spiega l'uso del super metodo in modo più comprensibile per i principianti. Almeno l'ho capito solo dal tuo commento :)
Ayaz Alifov

5

* Il onCreate(bundle)metodo della classe derivata deve chiamare l'implementazione della superclasse di questo metodo. Genererà un'eccezione SuperNotCalledException se la parola chiave " super " non viene utilizzata.

Per l'ereditarietà in Java, per sovrascrivere il metodo della superclasse e anche per eseguire il metodo della classe sopra, utilizzaresuper.methodname() nel metodo della classe derivata che sostituisce;

La classe Android funziona allo stesso modo. Estendendo la Activityclasse che ha il onCreate(Bundle bundle)metodo in cui è scritto il codice significativo e per eseguire quel codice nell'attività definita, utilizzare la parola chiave super con il metodo onCreate () like super.onCreate(bundle).

Questo è un codice scritto nel onCreate()metodo della classe Activity e il team di sviluppo Android potrebbe aggiungere del codice più significativo a questo metodo in un secondo momento. Quindi, per riflettere le aggiunte, dovresti chiamare super.onCreate () nella tua Activityclasse.

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

Mantiene anche la variabile mCalledche significa che hai chiamato super.onCreate(savedBundleInstance)nella tua attività.

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

Vedi il codice sorgente qui.

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

Perché su super.onCreate () raggiungerà la classe Activity (classe genitore di qualsiasi attività) per caricare il savedInstanceState, e normalmente non impostiamo nessuno stato di istanza salvato, ma il framework Android ha fatto in modo che dovremmo chiamare quella.


Il tuo codice verrà compilato felicemente anche se non chiami super.onCreate(savedInstanceState), a meno che tu non abbia qualche altro errore in esso
Raghav Sood

1

Sono le informazioni che vuoi restituire alla tua applicazione, tramite onCreate (), se l'attività viene distrutta e riavviata per qualche motivo implicito (ad esempio, non perché l'utente ha premuto il pulsante Indietro). L'utilizzo più comune di onSaveInstanceState () è quello di gestire le rotazioni dello schermo, poiché per impostazione predefinita, le attività vengono distrutte e ricreate quando l'utente fa scorrere la tastiera G1.

Il motivo per chiamare super.onCreate (savedInstanceState) è perché il tuo codice non verrà compilato altrimenti. ;-)

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.