super.onCreate (savedInstanceState);


88

Я створив проект програми Android, і в MainActivity.java> onCreate()він викликає super.onCreate(savedInstanceState).

Як початківець, чи може хтось пояснити, яка мета вищевказаного рядка?

Відповіді:


159

Кожна діяльність, яку ви робите, починається через послідовність викликів методів. onCreate()є першим із цих дзвінків.

Кожен із ваших видів діяльності поширюється android.app.Activityабо безпосередньо, або шляхом підкласу іншого підкласу Activity.

У Java, коли ви успадковуєте клас, ви можете замінити його методи, щоб запустити в них власний код. Дуже поширеним прикладом цього є заміщення toString()методу при розширенні java.lang.Object.

Коли ми замінюємо метод, ми маємо можливість повністю замінити метод у нашому класі або розширити метод існуючого батьківського класу. Зателефонувавши super.onCreate(savedInstanceState);, ви говорите віртуальній машині Dalvik запустити ваш код на додаток до існуючого коду в onCreate () батьківського класу. Якщо ви залишили цей рядок, тоді буде запущено лише ваш код . Існуючий код повністю ігнорується.

Однак ви повинні включити цей супервиклик у свій метод, тому що якщо ви цього не зробите, то onCreate()код в Activityніколи не запускається, і ваша програма зіткнеться з різними проблемами, такими як відсутність присвоєного контексту діяльності (хоча ви натиснете a, SuperNotCalledExceptionперш ніж у вас буде шанс зрозуміти, що у вас немає контексту).

Коротше кажучи, власні класи Android можуть бути неймовірно складними. Код у фреймворкових класах обробляє такі речі, як малювання інтерфейсу, прибирання будинку та підтримка життєвих циклів Activity та програми. superдзвінки дозволяють розробникам запускати цей складний код за лаштунками, забезпечуючи при цьому хороший рівень абстракції для наших власних програм.


2
ще одне запитання - коли ми замінюємо метод батьківського класу, чи все ще цей похідний метод містить код методу батьківського класу, або це новий новий метод?
Прамод

15
Якщо ви викликаєте супер, код батьківського методу ставиться туди, де знаходиться супервиклик. Якщо супер не називають, це новий метод.
Raghav Sood

2
Рагхав Суд, я думаю, вам слід додати текст коментаря до відповіді, оскільки він пояснює використання методу супер зрозумілішим для початківців. Принаймні я зрозумів це лише з вашого коментаря :)
Аяз Аліфов

5

* onCreate(bundle)Метод похідного класу повинен викликати реалізацію суперкласу цього методу. Це призведе до винятку SuperNotCalledException, якщо ключове слово " super " не використовується.

Для успадкування в Java, щоб замінити метод суперкласу, а також виконати вищезазначений метод класу, використовуйте super.methodname()в методі перевизначення похідного класу;

Клас Android працює так само. Розширюючи Activityклас, у якого є onCreate(Bundle bundle)метод, в якому написано значущий код, і для виконання цього коду у визначеній дії, використовуйте ключове слово super із методом onCreate () like super.onCreate(bundle).

Це код, написаний у onCreate()методі класу Activity, і команда Android Dev може пізніше додати до цього методу ще якийсь значущий код. Отже, щоб відобразити доповнення, ви повинні викликати super.onCreate () у своєму Activityкласі.

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

Він також підтримує змінну, mCalledщо означає, що ви зателефонували super.onCreate(savedBundleInstance)в свою активність.

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

Дивіться вихідний код тут.

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

Оскільки після super.onCreate () він досягне класу Activity (батьківський клас будь-якої активності), щоб завантажити saveInstanceState, і ми зазвичай не встановлюємо жодного збереженого стану екземпляра, але фреймворк Android зробив такий спосіб, що ми повинні викликати що.


Ваш код буде скомпільовано щасливо, навіть якщо ви не зателефонуєте super.onCreate(savedInstanceState), якщо у вас не буде іншої помилки
Raghav Sood

1

Це інформація, яку ви хочете повернути до своєї програми за допомогою onCreate (), якщо діяльність буде знищена та перезапущена з якоїсь неявної причини (наприклад, не тому, що користувач натиснув кнопку "Назад"). Найбільш поширеним використанням onSaveInstanceState () є обробка обертань екрану, оскільки за замовчуванням дії знищуються та відтворюються, коли користувач висуває клавіатуру G1.

Причиною виклику super.onCreate (savedInstanceState) є те, що ваш код не компілюється інакше. ;-)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.