Будучи новичком, у меня есть очень простой вопрос: я создал проект приложений для Android в Eclipse, в MainActivity.java > onCreate()
он вызывает super.onCreate(savedInstanceState)
.
Может ли кто-нибудь объяснить, что является целью вышеуказанной строки?
Ответ 1
Каждое действие, которое вы делаете, запускается с помощью последовательности вызовов методов. onCreate()
- это первый из этих вызовов.
Каждая из ваших действий расширяет android.app.Activity
либо напрямую, либо путем подкласса другого подкласса Activity
.
В Java, когда вы наследуете класс, вы можете переопределить его методы для запуска своего собственного кода. Очень распространенным примером этого является переопределение метода toString()
при расширении java.lang.Object
.
Когда мы переопределяем метод, у нас есть возможность полностью заменить метод в нашем классе или расширить существующий метод родительского класса. Вызвав super.onCreate(savedInstanceState);
, вы сообщите, чтобы Dalvik VM выполнил ваш код в дополнение к существующему коду в onCreate() родительского класса. Если вы оставите эту строку, то выполняется только ваш код. Существующий код полностью игнорируется.
Однако вы должны включить этот супервызов в свой метод, потому что, если вы этого не сделаете, код onCreate()
в Activity
никогда не будет запущен, и ваше приложение будет запущено во всех типах проблем, таких как отсутствие назначенного Контекста (хотя вы попадете в SuperNotCalledException
, прежде чем у вас появится возможность выяснить, что у вас нет контекста).
Короче говоря, собственные классы Android могут быть невероятно сложными. Код в классах классов обрабатывает такие вещи, как рисунок пользовательского интерфейса, очистка дома и сохранение жизненных циклов активности и приложений. super
позволяет разработчикам запускать этот сложный код за кулисами, при этом обеспечивая хороший уровень абстракции для наших собственных приложений.
Ответ 2
Метод Derived class onCreate(bundle)
должен вызывать реализацию суперкласса этого метода. Если вы этого не сделаете, исключение будет выбрано SuperNotCalledException
В Java
Когда вы выполняете наследование Если вы хотите переопределить метод суперкласса и хотите выполнить вышеописанный метод метода класса, в этом случае мы используем super.methodname()
в методе переопределения производного класса;
Класс Android работает одинаково. Вы расширяете класс Activity
, у которого есть метод onCreate(Bundle bundle)
, в котором написан значащий код. Итак, чтобы выполнить этот код в нашей определенной деятельности. Вы должны использовать super.onCreate(bundle)
.
Это код, написанный в классе Activity class onCreate()
, и, возможно, команда Android Dev добавит еще более значимый код в этот метод, поэтому вы всегда должны называть это в своем классе Activity
.
protected void onCreate(Bundle savedInstanceState) {
mVisibleFromClient = mWindow.getWindowStyle().getBoolean(
com.android.internal.R.styleable.Window_windowNoDisplay, true);
mCalled = true;
}
boolean mVisibleFromClient = true;
/**
* Control 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 allows
* you to prevent your 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 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
Ответ 3
Потому что после super.onCreate() он достигнет класса Activity (родительский класс любой активности) для загрузки сохраненногоInstanceState, и мы нормально не устанавливаем какое-либо состояние сохраненного экземпляра, но
андроидная инфраструктура была сделана таким образом, что мы должны это назвать.
Ответ 4
Это информация, которую вы хотите вернуть в приложение, через onCreate(),
если действие уничтожается и перезапускается из-за какой-то неявной причины
(например, не потому, что пользователь нажал кнопку "Назад" ). Самый распространенный
использование onSaveInstanceState() предназначено для обработки поворотов экрана, так как
по умолчанию, действия уничтожаются и воссоздаются при выходе пользователя
клавиатура G1.
Причиной вызова super.onCreate(savedInstanceState) является то, что ваш
код не будет компилироваться иначе.; -)