super.onCreate (saveInstanceState);

88

Utworzyłem projekt aplikacji dla systemu Android i w MainActivity.java> onCreate()wywołuje super.onCreate(savedInstanceState).

Czy jako początkujący ktoś może wyjaśnić, jaki jest cel powyższej linii?

Pramod
źródło

Odpowiedzi:

159

Każde wykonane działanie jest uruchamiane przez sekwencję wywołań metod. onCreate()jest pierwszym z tych wezwań.

Każda z Twoich działań rozszerza android.app.Activitysię bezpośrednio lub poprzez podklasę innej podklasy klasy Activity.

W Javie, gdy dziedziczysz z klasy, możesz przesłonić jej metody, aby uruchomić w nich własny kod. Bardzo częstym tego przykładem jest nadpisywanie toString()metody podczas rozszerzania java.lang.Object.

Kiedy nadpisujemy metodę, mamy możliwość całkowitego zastąpienia metody w naszej klasie lub rozszerzenia metody istniejącej klasy nadrzędnej. Wywołując super.onCreate(savedInstanceState);, informujesz maszynę wirtualną Dalvik, aby uruchomiła Twój kod oprócz istniejącego kodu w onCreate () klasy nadrzędnej. Jeśli pominiesz tę linię, zostanie uruchomiony tylko twój kod . Istniejący kod jest całkowicie ignorowany.

Musisz jednak uwzględnić to super wywołanie w swojej metodzie, ponieważ jeśli tego nie zrobisz, onCreate()kod Activitynigdy nie zostanie uruchomiony, a Twoja aplikacja napotka różne problemy, takie jak brak kontekstu przypisanego do działania (chociaż a, SuperNotCalledExceptionzanim zdasz sobie sprawę, że nie masz kontekstu).

Krótko mówiąc, własne klasy Androida mogą być niezwykle złożone. Kod w klasach frameworka obsługuje takie rzeczy, jak rysowanie interfejsu użytkownika, czyszczenie domu i utrzymywanie cykli życia działania i aplikacji. superwywołania pozwalają programistom uruchamiać ten złożony kod za kulisami, jednocześnie zapewniając dobry poziom abstrakcji dla naszych własnych aplikacji.

Raghav Sood
źródło
2
jeszcze jedno pytanie - kiedy nadpisujemy metodę klasy macierzystej, czy ta metoda pochodna nadal zawiera kod metody klasy macierzystej, czy jest to nowa nowa metoda?
Pramod
15
Jeśli wywołasz super, kod metody nadrzędnej zostanie umieszczony w miejscu, w którym znajduje się wywołanie super. Jeśli nie nazywa się super, jest to nowa metoda.
Raghav Sood
2
Raghav Sood, myślę, że powinieneś dodać tekst komentarza do odpowiedzi, ponieważ wyjaśnia on użycie super metody bardziej zrozumiale dla początkujących. Przynajmniej zrozumiałem to tylko z twojego komentarza :)
Ayaz Alifov
5

* onCreate(bundle)Metoda klasy pochodnej musi wywoływać implementację nadklasy tej metody. Jeśli słowo kluczowe „ super ” nie zostanie użyte, zgłosi wyjątek SuperNotCalledException .

Aby dziedziczyć w programie Java, aby przesłonić metodę nadklasy, a także wykonać powyższą metodę klasy, należy użyć super.methodname()w nadpisującej metodzie klasy pochodnej;

Klasa Androida działa w ten sam sposób. Rozszerzając Activityklasę, która ma onCreate(Bundle bundle)metodę, w której jest napisany znaczący kod, i aby wykonać ten kod w zdefiniowanej aktywności, użyj słowa kluczowego super z metodą onCreate () jak super.onCreate(bundle).

Jest to kod napisany w onCreate()metodzie klasy Activity , a zespół Android Dev może później dodać bardziej znaczący kod do tej metody. Tak więc, aby odzwierciedlić dodatki, powinieneś wywołać super.onCreate () w swojej Activityklasie.

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

Utrzymuje również zmienną, mCalledco oznacza, że ​​wywołałeś super.onCreate(savedBundleInstance)w swojej aktywności.

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

Zobacz kod źródłowy tutaj.

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
źródło
1

Ponieważ po super.onCreate () dojdzie do klasy Activity (klasa nadrzędna dowolnej aktywności), aby załadować saveInstanceState, a my zwykle nie ustawiamy żadnego zapisanego stanu instancji, ale framework androida zrobił tak, że powinniśmy wywołać że.

Govil
źródło
Twój kod skompiluje się szczęśliwie, nawet jeśli nie zadzwonisz super.onCreate(savedInstanceState), chyba że masz w nim jakiś inny błąd
Raghav Sood
1

Są to informacje, które chcesz zwrócić do aplikacji za pośrednictwem onCreate (), jeśli aktywność zostanie zniszczona i ponownie uruchomiona z jakiegoś niejawnego powodu (np. Nie dlatego, że użytkownik nacisnął przycisk Wstecz). Najczęstszym zastosowaniem onSaveInstanceState () jest obsługa obrotu ekranu, ponieważ domyślnie działania są niszczone i odtwarzane, gdy użytkownik wysuwa klawiaturę G1.

Powodem wywołania super.onCreate (saveInstanceState) jest to, że Twój kod nie skompiluje się w inny sposób. ;-)

M_ Fa
źródło