Правильна зупинка і перезавантаження activity є важливим процесом у її життєвому циклі, який забезпечує користувачів впевненістю, що ваш додаток завжди живий і не втратив результати своєї діяльності.
Є кілька основних сценаріїв, в яких ваша activity зупиняється і перезапускається:
• Користувач відкриває вікно Recent Apps і перемикається з вашого додатку в інший додаток. Activity у вашому додатку, яка в даний час була на передньому плані, зупинилася. Якщо користувач повертається в додаток за допомогою значка запуску на екрані Home або у вікні Recent Apps, activity перезавантажується.
• Користувач виконує дії у вашому додатку, який запускає нову activity. Поточна activity припиняється, коли створюється інша activity. Якщо користувач натискає кнопку Back, то перша activity перезапускається.
• Користувач отримує телефонний дзвінок під час використання додатку на своєму телефоні.
Клас Activity забезпечує два методи життєвого циклу: onStop() і onRestart(), які дозволяють спеціально обробляти, як ваша activity зупиняється і перезапускається. На відміну від загальмованого стану, який ідентифікує часткову обструкцію UI, зупинений стан гарантує, що користувальницький інтерфейс не видно і фокус користувача на окремій activity (або зовсім окремому додатку).
Примітка: Оскільки система зберігає екземпляр Activity в системній пам'яті, коли вона зупинилася, то, можливо, вам не треба реалізовувати onStop() і onRestart() (або навіть методи onStart() взагалі). Для більшості видів activity, які є відносно простими, activity просто відмінно буде зупинятися і перезапускатися, і вам, можливо, треба буде використовувати тільки onPause(), щоб призупинити поточні дії та від'єднатися від системних ресурсів.
Коли користувач залишає свою activity, система викликає onStop(), щоб зупинити activity (1). Якщо користувач повертається, коли activity зупинена, то система викликає onRestart() (2), потім швидко onStart() (3) і onResume() (4). Зверніть увагу, що незалежно від того, який сценарій викликає зупинку activity, система завжди викликає onPause() перед викликом onStop().
Зупинка Activity
Коли ваша activity отримує виклик методу onStop(), її більше не видно, і слід звільнити майже всі ресурси, які не потрібні, бо користувач їх не використовує. Після того, як ваша activity припиняється, система може знищити екземпляр, якщо це необхідно для відновлення системної пам'яті. У крайніх випадках, система може просто вбити процес вашого додатку без виклику фіналу activity зворотним викликом onDestroy(), тому важливо використовувати onStop(), щоб звільнити ресурси, які могли б привести до витоку пам'яті.
Хоча метод onPause() викликається перед onStop(), ви повинні використовувати onStop() для виконання більших та інтенсивно навантажуючих CPU операцій відключення, таких як запис інформації в базу даних.
Приклад реалізації onStop(), яка зберігає вміст чорнових нотаток на постійне зберігання:
@Override
protected void onStop() {
super.onStop(); // Завжди першим викликається метод the superclass
// Збережіть поточний проект записки тому, що дана activity зупиняється
// і ми хочемо бути впевненими, що поточна робота над запискою не втратиться.
ContentValues values = new ContentValues();
values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
getContentResolver().update(
mUri, // URI для оновлення замітки.
values, // Карта імен стовпців і нових значень, що застосовуються до них.
null, // не застосовуються ВИБРАНІ критерії.
null // НІДЕ не використовуються стовпці.
);
}
Коли ваша activity зупинилась, об'єкт Activity резидентно залишається в пам'яті і згадується, коли activity відновиться. Вам не потрібно повторно ініціалізувати компоненти, які були створені під час будь-якого з методів зворотного виклику, що ведуть до стану Resumed. Система також відстежує в макеті поточний стан для кожного View, тому, якщо користувач ввів текст в віджеті EditText, то зміст зберігається, так що вам не треба зберігати і відновлювати його.
Примітка: Навіть якщо система знищує вашу activity, коли вона зупинилася, вона як і раніше зберігає стан View об'єктів (наприклад, текст в EditText) в Bundle (краплина пари ключ-значення) і відновлює їх, якщо користувач переходить назад до того ж екземпляру activity (в наступному уроці розкажемо більше про використання Bundle для збереження інших даних стану у разі, коли ваша activity знищена і створена заново).
Пуск/перезапуск Activity
Коли ваша activity повертається на перший план з зупиненого стану, то вона отримує виклик onRestart(). Система також викликає метод onStart(), що відбувається щоразу, коли ваша activity стає видимою (чи перезапущена, чи створена вперше). Метод onRestart(), проте, викликається тільки тоді, коли activity відновлюється з зупиненого стану, тому можете використовувати його для виконання спеціальних реставраційних робіт, які можуть бути необхідними лише, якщо activity раніше була зупинена, але не знищена.
Рідко, коли додаток має використовувати onRestart(), щоб відновити стан activity, тому немає ніяких правил для цього методу, які застосовуються для основної множини додатків. Тим не менш, оскільки ваш метод onStop() повинен істотно очистити всі ресурси вашої activity, то вам буде треба повторно їх відтворити, коли поновлюється activity. Тим не менш, ви також повинні створити екземпляр їх, коли ваша activity створюється вперше (коли немає існуючого екземпляру activity). З цієї причини, ви повинні, як правило, використовувати метод зворотного виклику onStart(), як аналог методу onStop(), тому що система викликає onStart() і коли вона створює вашу activity, і коли вона перезапускає вашу activity з зупиненого стану.
Наприклад, оскільки користувач може не використовувати ваш додаток протягом тривалого часу, то, перш ніж повертатися до нього, метод onStart() буде хорошим місцем, щоб переконатися, що включені необхідні для системи функції:
@Override
protected void onStart() {
super.onStart(); // Завжди викликайте першим метод superclass
// Activity перезапускаєся або стартує,
// тому ми повинні переконатися, що GPS включений
LocationManager locationManager =
(LocationManager) getSystemService(Context.LOCATION_SERVICE);
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!gpsEnabled) {
// Створіть тут діалогове вікно, яке пропонує користувачу включити GPS і здійснити наміри з дією
// android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS
// щоб перевести користувача до екрану Settings де включити GPS натисканням "OK"
}
}
@Override
protected void onRestart() {
super.onRestart(); // Завжди викликайте першим метод superclass
// Activity стартувала з зупиненого стану
}
Коли система знищує вашу activity, вона викликає метод onDestroy() для вашої Activity. Хоча вам треба, як правило, відпустити більшість своїх ресурсів з onStop() до того часу, як отримаєте виклик onDestroy(), але існує не так багато додатків, для яких це треба зробити. Цей метод є вашим останнім шансом, щоб очистити ресурси, які могли б призвести до витоку пам'яті, тому ви повинні переконатися, що зруйновані додаткові потоки, а також зупинені інші такі довго працюючі дії, як метод трасування.
(Джерело: developer.android.com)