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?
Odpowiedzi:
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.Activity
się 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 Activity
nigdy nie zostanie uruchomiony, a Twoja aplikacja napotka różne problemy, takie jak brak kontekstu przypisanego do działania (chociaż a, SuperNotCalledException
zanim 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. super
wywołania pozwalają programistom uruchamiać ten złożony kod za kulisami, jednocześnie zapewniając dobry poziom abstrakcji dla naszych własnych aplikacji.
* 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 Activity
klasę, 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 Activity
klasie.
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ą, mCalled
co 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.
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.
super.onCreate(savedInstanceState)
, chyba że masz w nim jakiś inny błąd
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. ;-)