super.onCreate (savedInstanceState);


88

Я создал проект приложения для Android, и в MainActivity.java> onCreate()он вызывает super.onCreate(savedInstanceState).

Как новичок, может ли кто-нибудь объяснить, для чего предназначена эта строка?

Ответы:


160

Каждое действие, которое вы выполняете, запускается последовательностью вызовов методов. onCreate()это первый из этих звонков.

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

В Java, когда вы наследуете класс, вы можете переопределить его методы, чтобы запустить в них свой собственный код. Очень распространенный пример этого - переопределение toString()метода при расширении java.lang.Object.

Когда мы переопределяем метод, у нас есть возможность полностью заменить метод в нашем классе или расширить метод существующего родительского класса. По призванию super.onCreate(savedInstanceState);, вы говорите Dalvik VM для запуска кода в дополнение к существующему коду в OnCreate () родительского класса. Если вы пропустите эту строку, будет запущен только ваш код . Существующий код полностью игнорируется.

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

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


2
еще один вопрос - когда мы переопределяем метод родительского класса, тогда этот производный метод по-прежнему содержит код метода родительского класса или это новый свежий метод?
— Pramod

15
Если вы вызываете super, код родительского метода помещается там, где находится вызов super. Если super не вызывается, то это свежий метод.
— Raghav Sood

2
Рагхав Суд, я думаю, вам следует добавить текст комментария к ответу, поскольку он более понятно объясняет использование супер-метода для начинающих. По крайней мере, я понял это только из вашего комментария :)
— Аяз Алифов

5

* onCreate(bundle)Метод производного класса должен вызывать реализацию этого метода суперкласса. Это вызовет исключение SuperNotCalledException, если ключевое слово « super » не используется.

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

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

Это код, написанный на onCreate()методе класса Activity, и команда разработчиков Android может позже добавить в этот метод более содержательный код. Итак, чтобы отразить дополнения, вы должны вызвать 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 (родительский класс любого действия) для загрузки сохраненного состояния экземпляра, и мы обычно не устанавливаем какое-либо сохраненное состояние экземпляра, но структура Android сделана таким образом, что мы должны вызывать что.


Ваш код будет super.onCreate(savedInstanceState)успешно компилироваться, даже если вы не позвоните , если только у вас нет других ошибок в нем
— Рагхав Суд

1

Это информация, которую вы хотите вернуть своему приложению через onCreate (), если действие уничтожено и перезапущено по какой-то неявной причине (например, не потому, что пользователь нажал кнопку возврата). Чаще всего onSaveInstanceState () используется для обработки поворота экрана, так как по умолчанию действия уничтожаются и воссоздаются, когда пользователь вынимает клавиатуру G1.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.