Я створив проект програми Android, і в MainActivity.java> onCreate()
він викликає super.onCreate(savedInstanceState)
.
Як початківець, чи може хтось пояснити, яка мета вищевказаного рядка?
Відповіді:
Кожна діяльність, яку ви робите, починається через послідовність викликів методів. onCreate()
є першим із цих дзвінків.
Кожен із ваших видів діяльності поширюється android.app.Activity
або безпосередньо, або шляхом підкласу іншого підкласу Activity
.
У Java, коли ви успадковуєте клас, ви можете замінити його методи, щоб запустити в них власний код. Дуже поширеним прикладом цього є заміщення toString()
методу при розширенні java.lang.Object
.
Коли ми замінюємо метод, ми маємо можливість повністю замінити метод у нашому класі або розширити метод існуючого батьківського класу. Зателефонувавши super.onCreate(savedInstanceState);
, ви говорите віртуальній машині Dalvik запустити ваш код на додаток до існуючого коду в onCreate () батьківського класу. Якщо ви залишили цей рядок, тоді буде запущено лише ваш код . Існуючий код повністю ігнорується.
Однак ви повинні включити цей супервиклик у свій метод, тому що якщо ви цього не зробите, то onCreate()
код в Activity
ніколи не запускається, і ваша програма зіткнеться з різними проблемами, такими як відсутність присвоєного контексту діяльності (хоча ви натиснете a, SuperNotCalledException
перш ніж у вас буде шанс зрозуміти, що у вас немає контексту).
Коротше кажучи, власні класи Android можуть бути неймовірно складними. Код у фреймворкових класах обробляє такі речі, як малювання інтерфейсу, прибирання будинку та підтримка життєвих циклів Activity та програми. super
дзвінки дозволяють розробникам запускати цей складний код за лаштунками, забезпечуючи при цьому хороший рівень абстракції для наших власних програм.
* 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()");
}
}
Дивіться вихідний код тут.
Оскільки після super.onCreate () він досягне класу Activity (батьківський клас будь-якої активності), щоб завантажити saveInstanceState, і ми зазвичай не встановлюємо жодного збереженого стану екземпляра, але фреймворк Android зробив такий спосіб, що ми повинні викликати що.
super.onCreate(savedInstanceState)
, якщо у вас не буде іншої помилки
Це інформація, яку ви хочете повернути до своєї програми за допомогою onCreate (), якщо діяльність буде знищена та перезапущена з якоїсь неявної причини (наприклад, не тому, що користувач натиснув кнопку "Назад"). Найбільш поширеним використанням onSaveInstanceState () є обробка обертань екрану, оскільки за замовчуванням дії знищуються та відтворюються, коли користувач висуває клавіатуру G1.
Причиною виклику super.onCreate (savedInstanceState) є те, що ваш код не компілюється інакше. ;-)