- •Використання LogCat
- •Повороти і життєвий цикл активності
- •Конфігурації пристроїв і альтернативні ресурси
- •Створення макету для альбомної орієнтації
- •Збереження даних між поворотами
- •Перевизначення onSaveInstanceState(Bundle)
- •Знову про життєвий цикл Activity
- •Виконання(додаток мабуть і знаходиться на передньому плані)
- •Для допитливих: тестування onSaveInstanceState(Bundle)
- •Контрольні запитання
Лаборторна робота №3
Тема: Життєвий цикл Activity.
Мета: Навчитися перевизначити методи життєвого циклу, щоб
відстежувати основні переходи життєвого циклу QuizActivity
Прилади і матеріали:
пакет Java Development Kit( JDK8);
Eclipse — інтегроване середовище розробки для Android;
Android Developer Tools ADT — плагін для Eclipse;
Android SDK
Хід роботи
У
кожного екземпляра
Activity
є
життєвий цикл. Під час цього життєвого
циклу активність переходить між трьома
можливими станами: виконання, призупинення
і зупинка. Для кожного переходу у Activity
існує метод, який оповіщає активність
про зміну стану. На мал. 3.1 зображений
життєвий цикл активності, стани і
методи.
Субкласи Activity можуть використати методи, представлені на мал. 3.1, для виконання необхідних дій під час критичних переходів життєвого циклу активності.
Один з таких методів вам вже знаком — це метод onCreate(Bundle). ОС викликає цей метод після створення екземпляра активності, але до його відображення на екрані.
Як правило, активність перевизначає onCreate(.) для підготовки призначеного для користувача інтерфейсу :
заповнення віджетів і їх виведення на екран(виклик setContentView(int));
отримання посилань на заповнені віджети;
призначення слухачів віджетам для обробки взаємодії з користувачем;
підключення до зовнішніх даних моделі.
Важливо розуміти, що ви ніколи не викликаєте onCre - ate(.) або інші методи життєвого циклу Activity у своїх застосуваннях. Ви перевизначаєте їх в субкласах активності, а Android викликає їх в потрібний момент часу.
Реєстрація подій життєвого циклу Activity
У цій лабораторній роботі ми перевизначимо методи життєвого циклу, щоб відстежувати основні переходи життєвого циклу QuizActivity. Реалізації обмежуються реєстрацією в журналі повідомлення про виклик методу.
Створення повідомлень в журналі
У Android клас android.util.Log відправляє журнальні повідомлення в загальний журнал системного рівня. Клас Log надає декілька методів реєстрації повідомлень. Наступний метод найчастіше зустрічається:
public static int d(String tag, String msg)
Ім'я «d» означає «debug»(відладка) і відноситься до рівня реєстрації повідомлень. (Рівні Log детальніше розглядаються в останній лабораторній роботі.) Перший параметр визначає джерело повідомлення, а другий — його вміст.
Перший рядок зазвичай містить константу TAG, значенням якої є ім'я класу. Це дозволяє легко визначити джерело конкретного повідомлення.
У файлі QuizActivity.java додайте константу TAG в QuizActivity.
Лістинг 3.1. Додавання константи TAG(QuizActivity.java)
...
Якщо Eclipse видасть помилку, що відноситься до класу Log, натисніть Command+Shift+O(Ctrl+Shift+O) для проведення організації імпорту. Eclipse запропонує вибрати клас, що імпортується; виберіть android.util.Log.
Тепер перевизначите ще п'ять методів в QuizActivity.
Лістинг 3.3. Перевизначення методів життєвого циклу(QuizActivity.java)
} // Кінець onCreate(Bundle)
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart() called");
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause() called");
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume() called");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop() called");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() called");
}
}
Зверніть увагу на виклики реалізацій суперкласу перед реєстрацією повідомлень. Ці виклики є обов'язковими, причому реалізація суперкласу повинна викликатися до виконання яких-небудь критичних операцій в onCreate(.); у інших методах порядок менш важливий.
Можливо, ви помітили анотацію @Override. Вона наказує компілятору простежити за тим, щоб клас дійсно містив перевизначуваний метод. Наприклад, компілятор зможе попередити вас про друкарську помилку в імені методу :
public class QuizActivity extends Activity {
@Override
public void onCreat(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_quiz);
}
...
Клас Activity не містить метод onCreat(Bundle), тому компілятор видає попередження. Це дозволить вам виправити друкарську помилку замість того, щоб випадково
реалізувати QuizActivity.onCreat(Bundle).
Використання LogCat
Щоб проглянути системний журнал під час роботи додатка, використайте LogCat — програму, включену в інструментарій Android SDK.
Щоб запустити LogCat, виконаєте команду Window-Show View-Other... У теці
Android знайдіть і виділіть LogCat, потім клацніть на кнопці OK(мал. 3.2).
LogCat відкривається в правій половині екрану, а панель редактора стає занадто дрібною. Було б зручніше, якби панель LogCat розміщувалася в нижній частині інструментального вікна.
Щоб перемістити панель, перетягнете корінець панелі LogCat на панель інструментів в правому нижньому кутку інструментального вікна(мал. 3.3).
Панель LogCat закривається, а її значок
Мал. 3.2. Пошук програми LogCat з'являється на панелі інструментів. Клацніть на значку; LogCat відкривається
у нижній частині вікна.
Інструментальне вікно Eclipse повинне виглядати приблизно так, як показано на мал. 3.4. Ви можете змінити розміри внутрішніх панелей LogCat, перетягуючи їх межі мишею(це відноситься до будь-яких панелей в інструментальному вікні Eclipse).
Запустіть GeoQuiz; на панелі LogCat почнуть швидко з'являтися повідомлення. Більшість з них генерується системою. Прокрутіть список і знайдіть свої повідомлення. У стовпці TAG панелі LogCat виводиться константа TAG, визначена
для QuizActivity.
(Якщо ніякі повідомлення не виводяться, можливо, LogCat відстежує не той пристрій. Виконайте команду Window-Show View-Other... і відкрийте панель Devices. Виберіть пристрій, на якому працює програма, і поверніться до LogCat.)
Щоб спростити пошук повідомлень, можна відфільтрувати виведення по константі TAG. У LogCat клацніть на зеленому значку + у верхній частині лівої внутрішньої панелі; ця кнопка створює фільтр повідомлень. Введіть ім'я фільтру QuizActivity і введіть рядок QuizActivity в поле by Log Tag :(мал. 3.5).
Мал. 3.3. Перетягання корінця LogCat на панель інструментів в правому нижньому кутку
Мал. 3.4. Інструментальне вікно Eclipse з панеллю LogCat
Мал. 3.5. Створення фільтру в LogCat
Клацніть на кнопці OK; відкривається нова вкладка, в якій виводяться тільки сполучення з міткою QuizActivity(мал. 3.6). Після запуску GeoQuiz були викликані три методи життєвого циклу і був створений початковий екземпляр QuizActivity.
Мал. 3.6. Запуск GeoQuiz супроводжується створенням, запуском і продовженням активності
(Якщо ви не бачите відфільтрований список, виберіть фільтр QuizActivity на лівій панелі LogCat.)
А тепер трохи поекспериментуємо. Натисніть на пристрої кнопку Back, а потім перевірте виведення LogCat. Активність додатка отримала виклики onPause(),
onStop() і onDestroy().
Мал. 3.7. Натиснення кнопки Back призводить до знищення активності
Натискаючи кнопку Back, ви повідомляєте Android: «Я завершив роботу з активністю, і вона мені більше не потрібна». Android знищує активність, щоб не уникнути неефективного витрачання обмежених ресурсів пристрою.
Перезапустіть додаток GeoQuiz. Натисніть кнопку Home і перевірте виведення LogCat. Ваша активність отримала виклики onPause() і onStop(), але не виклик
onDestroy().
Мал. 3.8. Натиснення кнопки Home зупиняє активність
Викличте на пристрої диспетчер завдань. На нових пристроях для цього слід натиснути кнопку Recents поряд з кнопкою Home(мал. 3.9). На пристроях без кнопки Recents виконаєте довге натиснення кнопки Home.
Кнопка Home
Кнопка Back Кнопка Recents
Мал. 3.9. Кнопки Home, Back і Recents
У диспетчерові завдань натисніть на додатку GeoQuiz і перевірте виведення LogCat. Активність запускається і продовжує роботу, але створювати її не треба.
Натиснення кнопки Home повідомляє Android: «Я зараз займуся іншою справою, але потім можу повернутися». Android призупиняє активність, але намагається не знищувати її на випадок повернення.
Проте існування зупиненої активності не гарантоване. Якщо системі знадобиться зайнята пам'ять, вона знищує зупинені активності.
Нарешті, представте маленьке тимчасове вікно, яке тільки частково закриває активність. При появі такого вікна активність, що знаходиться за ним, призупиняється і взаємодія з нею неможлива. Виконання активності буде продовжено, коли тимчасове вікно буде закрито.
Далі ми перевизначатимемо різні методи життєвого циклу активності для вирішення реальних завдань. При цьому застосування кожного методу розглядатиметься детальніше.
