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.