На відміну від інших парадигм програмування, в якому додатки запускаються за допомогою методу main(), Android-система ініціює код в екземплярі Activity, викликаючи специфічні методи зворотного виклику, які відповідають конкретним етапах його життєвого циклу.
Існує послідовність методів зворотного виклику, які запускають activity, і послідовність методів зворотного виклику, які зупиняють Activity.
В цьому уроці розглянемо найбільш важливі методи життєвого циклу і покажемо, як впоратися з першим життєвим циклом зворотнго виклику, який створює новий екземпляр вашої activity.
Поняття зворотних викликів життєвого циклу
Протягом життя одного з видів activity, система викликає основний набір методів життєвого циклу в послідовності, аналогічній ступінчастій піраміді. Тобто, кожен етап життєвого циклу activity є окремим кроком на піраміді. Коли система створює новий екземпляр activity, кожен метод зворотного виклику переміщує стан activity на один крок до вершини. Верхня частина піраміди є точкою, в якій activity виконується на передньому плані, і користувач може взаємодіяти з нею.
Як тільки користувач починає покидати activity, система викликає інші методи, які переміщають стан activity донизу піраміди, щоб демонтувати activity. У деяких випадках, activity буде рухатися тільки частиною шляху вниз по піраміді і чекати (наприклад, коли користувач перемикається на інший додаток), звідки activity може повернутися в початок (якщо користувач повертається до activity) і продовжити, де користувач зупинився.
Спрощена ілюстрація життєвого циклу activity, виражена у вигляді ступінчастою піраміди.
Малюнок показує, як кожний зворотній виклик, використаний, щоб зробити крок activity до заключного стану на вершині, де метод зворотного виклику заставляє activity зробити крок вниз. Activity може також повернутися до відновленого стані з станів Paused і Stopped.
Залежно від складності вашої activity, вам, ймовірно, не потрібно реалізовувати всі методи життєвого циклу. Тим не менш, важливо, щоб ви розуміли кожен стан і реалізовували ті, які забезпечують поведінку вашого додатку таку, яку очікують користувачі. Правильна реалізація ваших методів життєвого циклу activity гарантує, що ваш додаток поводиться чудово, кількома способами, в тому числі, що він:
• Не збоїть, якщо користувач отримує телефонний дзвінок або перемикається на інший додаток під час користування вашим додатком.
• Не використовує цінні системні ресурси, коли користувач не використовує його активно.
• Не втрачається робота користувачів, якщо вони залишають ваш додаток і повертаються до нього пізніше.
• Не збоїть або не втрачає роботу користувача, коли екран змінюється між альбомною і портретною орієнтаціями.
Ви дізнаєтеся в наступних уроках, що є кілька ситуацій, в яких activity переходить між різними станами, які зображені на малюнку вище. Однак, тільки три з цих станів можуть бути статичними. Тобто, activity може існувати тільки в одному з трьох станів протягом тривалого періоду часу:
Resumed (Поновлення)
У цьому стані activity знаходиться на передньому плані і користувач може взаємодіяти з нею. (Також іноді називають «запущеним» станом).
Paused (Призупинено)
У цьому стані activity частково закрита деякою роботою іншої activity, на передньому плані вона напівпрозора або не покриває весь екран. Призупинена activity не приймає введення користувача і не може виконати який-небудь код.
Stopped (Зупинено)
У цьому стані activity повністю прихована і не видна користувачеві; це ще називають фоновим режимом. Під час зупинки екземпляр activity і всі його дані про стан, такі як змінні членів зберігаються, але вона не може виконати який-небудь код.
Інші стани (Created і Started) минущі і система швидко переходить від них до наступного стану, викликавши наступний метод зворотного виклику життєвого циклу. Тобто, після того, як система викликає onCreate(), вона швидко викликає onStart(), яка потім швидко переходить до onResume().
Це все для основного життєвого циклу activity. Тепер почнемо вивчати деяку конкретну поведінку життєвого циклу
Вказування в своїх додатках Activity, яка запускається
Коли користувач вибирає значок додатку на головному екрані, то система викликає метод onCreate() для Activity у вашому додатку, яку ви оголосили "пусковою" (або "головною") activity. Це activity, яка служить основною точкою входу в інтерфейс користувача додатку.
Ви можете визначити, яка activity буде використовуватися, як основна activity, у файлі маніфесту Android, AndroidManifest.xml, який знаходиться в корені каталогу проекту.
Основна activity для вашого додатку повинна бути оголошені в маніфесті з <intent-filter>, який містить дію MAIN і категорію LAUNCHER. Наприклад:
<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Примітка: При створенні нового проекту Android з інструментами Android SDK, файли проекту за замовчуванням включають в себе клас Activity, який оголошений в маніфесті з цим фільтром. Якщо яка-небудь дія MAIN або категорія LAUNCHER не оголошені для однієї з ваших activity, то значок вашого додатку не з'явиться в списку додатків на головному (Home) екрані.
Створення нового екземпляру
Більшість додатків включають в себе кілька різних видів activity, які дозволяють користувачеві виконувати різні дії. Коли activity є основною activity, то створюється, коли користувач натискає значок додатку або іншої activity, яку запускає ваш додаток у відповідь на дії користувача. Система створює кожен новий екземпляр Activity шляхом виклику методу onCreate().
Необхідно реалізувати метод onCreate(), щоб виконати основну логіку запуску додатку, що має статися лише один раз за весь термін життя activity. Наприклад, ваша реалізація onCreate() повинна визначити користувальницький інтерфейс і, можливо, екземпляри деяких змінних класу області видимості.
Наступний приклад методу onCreate() показує деякий код, який виконує деякі фундаментальні установки для activity. Такі, як оголошення інтерфейсу користувача (визначений у XML-файлі макета), визначення змінних членів та налаштування деяких UI:
TextView mTextView; // Змінна члену для перегляду тексту в макеті
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Встановіть макет інтерфейсу користувача для цієї Activity
// Файл макета визначається для проекту у файлі res/layout/main_activity.xml
setContentView(R.layout.main_activity);
// Ініціалізуйте член TextView, щоб ним можна було маніпулювати пізніше
mTextView = (TextView) findViewById(R.id.text_message);
// Переконайтеся, що запустили на Honeycomb або новішій для використання ActionBar APIs
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// Для основної activity переконайтеся, що значок додатку на панелі дій не веде себе як кнопка
ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(false);
}
}
Увага: Використовуйте SDK_INT, щоб запобігти виконанню більш старими системами нових API, які працюють так тільки на Android 2.0 (API рівня 5 і вище).
Після завершує виконання onCreate(), система викликає методи onStart() і onResume() у швидкій послідовності. Ваша activity ніколи не перебуває в станах Created або Started. Технічно, activity стає видимою для користувача, коли викликано onStart(), але негайно слідує onResume() і activity залишається у стані Resumed поки щось не відбувається, щоб змінити його, наприклад, при отриманні телефонного дзвінка користувач переходить до іншої activity, або екран пристрою гасне.
В наступних уроках побачите, що інші методи запуску onStart() і onResume(), є корисними під час життєвого циклу вашої activity, коли використовується для відновлення activity після станів Paused або Stopped.
Примітка: Метод onCreate() включає в себе параметр, що називається savedInstanceState, який обговорюється в останньому уроці про відтворення activity.
Ілюстрація структури життєвого циклу activity з акцентом на трьох основних зворотних викликах.
Ці виклики система робить послідовно при створенні нового екземпляра activity: onCreate(), onStart() і onResume(). Після того, як ця послідовність зворотних викликів завершується, activity досягає стану Resumed, в якому користувачі можуть взаємодіяти з activity, поки вони не переключитися на іншу activity.
Знищення Activity
У той час, як перший зворотній виклик життєвого циклу activity є onCreate(), її самий останнім зворотнім викликом є onDestroy(). Система викликає цей метод на вашій activity як кінцевий сигнал про те, що екземпляр activity буде повністю видалений з пам'яті системи.
Більшості додатків не треба реалізувати цей метод, тому що посилання локального класу знищуються з activity і ваша activity повинна бути повністю очищена через onPause() і onStop(). Однак, якщо ваша activity включає в себе фонові теми, які ви створили під час onCreate(), або інші тривалі ресурси, які можуть потенційно викликати витік пам'яті, якщо їх не закрити, то ви повинні їх вбити за допомогою onDestroy().
@Override
public void onDestroy() {
super.onDestroy(); // Завжди викликається superclass
// Stop method tracing that the activity started during onCreate()
android.os.Debug.stopMethodTracing();
}
Примітка: Система викликає onDestroy() після того, як вже викликані onPause() і onStop() у всіх ситуаціях, крім однієї: коли ви телефонуєте finish() зсередини методу onCreate(). У деяких випадках, наприклад, коли ваша activity функціонує як тимчасове рішення розробника, щоб запустити іншу activity, ви можете викликати finish() з onCreate(), щоб знищити activity. У цьому випадку система негайно викликає onDestroy() без виклику будь-яких інших методів життєвого циклу.
На завершення, невелике відео про життєвий цикл activity:
(Джерело: developer.android.com)