Життєвий цикл активності – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

Перше питання, яке ми повинні зясувати при розробці для Android, – як поводиться наша активність У випадку з ОС Android цей процес називається життєвим циклом активності і являє собою опис станів і переходів між цими станами протягом усього часу існування активності Спочатку обговоримо теоретичні аспекти цієї теми

У теорії

Активність може знаходитися в одному з трьох станів

Працює У цьому стані активність є поточної, займає екран і безпосередньо взаємодіє з користувачем

Припинена Стан настає, коли активність все ще видно на екрані, але частково закрита або іншої прозорої активністю, або діалогом, або екран заблокований Призупинена активність може бути знищена системою в будь-який момент (наприклад, при нестачі памяті) Зверніть увагу – примірник призупиненої активності не знищується він продовжує зберігатися в купі VM, чекаючи повернення у працюючий стан Зупинена Стан настає, коли активність повністю закрита другий активністю і тому більше не видна на екрані Наприклад, наша активність AndroidBasicsStarter перейде в даний стан, якщо ми запустимо одну з тестових активностей Крім того, перехід в даний стан настає при натисканні користувачем кнопки Ноті (Додому) для переходу на домашній екран ОС Система також може знищити зупинену активність і вивантажити її з памяті при її нестачі

Як бачите, і в загальмованому, і в зупиненому станах система Android може знищити активність у будь-який момент Це може відбуватися ввічливо, з попереднім інформуванням активності (викликом методу finishedC), або грубо, мовчазним знищенням процесу

Активність може бути повернена у працюючий стан з режимів паузи або зупинки Знову зауважу – активність в будь-якому стані є одним і тим же Java-екземпляром у памяті, тому всі її вміст залишається в тому ж стані, що і перед зупинкою або припиненням

У активності є кілька захищених методів, які ми можемо перевизначити для отримання інформації про зміни стану

Activity OnCreate – метод викликається при першому запуску активності У ньому ми встановлюємо компоненти інтерфейсу і звертаємося до системи вводу Цей метод викликається всього один раз протягом життєвого циклу активності

Activity OnRestart – метод викликається при поверненні активності із зупиненого стану Йому має передувати виклик методу onStop

Acti vity OnStartC – метод викликається після методу onCreate або коли активність повертається з зупиненого стану У другому випадку йому передує виклик методу onRestart

Acti vity OnResume – метод викликається після виведення методу onStartO або коли активність повертається з призупиненого стану (наприклад, при розблокуванні екрану)

Activity onPauseO – метод викликається при переході активності в пріостанов-х ленное стан Це може виявитися останнім отриманим нами оповіщенням, оскільки ОС може вирішити закрити наш додаток без повідомлення Тому в цьому методі нам необхідно зберегти всі важливі для нас параметри програми

Acti vi ty onStop – метод викликається при переході активності в режим зупинки Йому передує виклик методу onPause – перед переходом активності в зупинене стан вона завжди спочатку проходить режим паузи Як і у випадку з onPause, це може бути останній момент, коли ми отримуємо інформацію від програми перед його закриттям операційною системою Тут ми також можемо зберегти поточний стан Однак система може вирішити не викликати цей метод і просто знищити активність Тому, оскільки перед onStop і мовчазним закриттям програми завжди викликається onPause, збереження важливої ​​для нас інформації найкраще доручити методу onPause

Acti vi ty onDestroy – метод викликається в кінці життєвого циклу активності, коли вона остаточно знищується Це остання точка, в якій ми можемо отримати і зберегти якісь дані, які хочемо отримати назад при пересоздании нашої активності Зверніть увагу – цей метод може ніколи не викликатися, якщо активність була знищена системою в неявному режимі після виклику onPauseC або onStopO

Малюнок 43 ілюструє життєвий цикл активності та порядок виклику методів

Рис 43 Потужний і заплутаний життєвий цикл активності

Отже, з теоретичної частини нам необхідно витягти три важливих уроку

Перед переходом нашої активності в працююче стан завжди викликається метод onResume незалежно від того, повертаємося ми з призупиненого або зупиненого стану Тому ми спокійно можемо ігнорувати методи onRestartO і onStartO Нам не потрібно піклуватися про те, з якого стану повертається активність У випадку з нашими іграми нам слід лише знати, що зараз активність запущена, для чого цілком достатньо сигналу від методу onRes ume

Активність може бути знищена без оповіщення після виклику методу onPauseC Тому ми ніколи не повинні покладатися на обовязковий виклик методів onStop або onDestroyC Ми також знаємо, що onPauseC завжди передує викликом onStop, тому ми цілком можемо ігнорувати методи onStopC і onDest гоу – нам достатньо буде перевизначити метод onPause У ньому ми можемо забезпечити збереження всієї важливої ​​для нас інформації (наприклад, поточного рівня або кращих результатів), записавши їх на зовнішній носій (карту памяті) Після виклику onPauseC прийом ставок закінчується, і ми не будемо знати, чи запуститься наше додаток

Ми знаємо, що метод onDest гоу може ніколи не бути викликаний, якщо система вирішить знищити активність після виклику методів onStop або onPause Проте нам було б непогано знати, чи готується наша активність до знищення Як же ми дізнаємося про це, якщо onDest гоу НЕ буде викликаний Клас Activity включає в себе метод Activity, isFinishing, який ми можемо викликати в будь-який час, щоб перевірити, чи планується знищення нашої активності Нам гарантований виклик принаймні методу onPause перед знищенням активності Все, що нам потрібно, – викликати is Finishing всередині методу onPauseC, щоб зрозуміти, чи планує система знищення активності після виклику onPauseC

Все це дещо спрощує справу Нам необхідно перевизначити лише такі методи: onCreateC – створюємо наше вікно і візуалізуються компоненти інтерфейсу, а також отримуємо користувача введення onResumeС – Стартуємо (або відновлюємо) onPauseC – ставимо на паузу потік основного циклу і, якщо Activity is Finishing повертає true, зберігаємо на диск важливу інформацію

Багатьох напружує робота з життєвим циклом активності, але якщо слідувати цим простим правилам, гра буде здатна обробляти постановку на паузу, відновлення та очищення

На практиці

Напишемо наш перший тестовий приклад, що демонструє життєвий цикл активності Нам буде потрібен деякий висновок на екран, що показує зміни стану Зробимо це двома способами

Створимо окремий TextVi ew – компонент інтерфейсу для відображення в активності Він потрібен для виведення тексту (ми вже використовували його неявно для демонстрації елементів списку в нашій стартовою активності) Кожен раз при переході в новий стан ми додаємо рядок до елементу TextVi ew, який в результаті зможе показати нам всю історію змін станів додатки

Оскільки у нас не буде можливості показати подія руйнування нашої активності в TextVi ew (воно зникне з екрана занадто швидко), ми також відстежимо зміни станів в LogCat Це буде реалізовано за допомогою класу Log, що пропонує набір статичних методів для додавання повідомлень в LogCat

Памятайте, що нам необхідно додати тестову активність в наше тестове додаток По-перше, ми визначаємо її у файлі маніфесту у вигляді елемента , що є дочірнім по відношенню до &ltappl i cati on&gt:

Далі ми додаємо новий Java-клас LifeCycleTest в пакет combadlogic androidgames Нарешті, нам необхідно додати назву цього класу в масив tests класу AndroidBasicsStarter, визначеного нами раніше Нам доведеться повторити всі ці кроки для всіх тестових активностей, які ми будемо створювати далі Для стислості я більше не буду про них згадувати Зауважте також, що я не визначив орієнтацію екрану для активності LifeCycleTest У даному прикладі вона може бути як портретної, так і ландшафтної, залежно від розташування пристрою Це зроблено для того, щоб ви могли побачити вплив зміни орієнтації, на життєвий цикл активності (взагалі це залежить від значення атрибута configChanges) Лістинг 42 демонструє код активності

Лістинг 42 LifeCycleTestJava, що демонструє життєвий цикл активності package combadlogi сandroi dgames

Швидко пробіжимося по коду Як і очікувалося, клас успадковується від Activity У ньому визначені два члени – StringBuilder, який зберігає всі створені нами повідомлення, і TextView, який використовується для відображення цих повідомлень в активності

Далі ми визначаємо маленький допоміжний метод, який записує текст у журнал LogCat, який додає текст в StringBuilder і відновлювальний TextVi ew Для виведення в LogCat використовується статичний метод LogdO, як перший аргумент приймає тег, а в якості другого – текст повідомлення

У методі onCreateC) ми, як завжди, викликаємо спочатку метод базового класу Далі ми створюємо обєкт TextVi ew і встановлюємо його в якості переглядача вмісту для нашої активності Цей елемент займають весь простір нашої активності Нарешті, ми записуємо створене повідомлення в LogCat і оновлюємо значення тексту в TextView за допомогою раніше певного методу 1 од

Потім ми перевизначають метод onResumeС) Як і з усіма переобумовленої методами активності, спочатку викликаємо метод базового класу Після цього все, що ми робимо, – знову викликаємо метод 1 од з текстом resumed як аргумент

Перевизначення метод onPauseC) виглядає дуже схожим на onResumeO Ми записуємо в журнал рядок paused (зупинено) Нам також необхідно знати, чи збирається система знищити активність після виклику onPauseC), тому ми викликаємо метод Acti vity i sFi ni shi ng Якщо він повертає значення true, ми також пишемо про це в журнал Звичайно, в цьому випадку ми не зможемо побачити оновлений текст в TextVi ew – активність буде знищена до того, як зміна відобразиться на екрані Тому-то ми і виводимо повідомлення в журнал LogCat

Відкрийте програму і пограйте трохи з тестовою активністю Ось послідовність дій, яку ви можете виконати

1 Запустити тестову активність з стартової активності

2 Заблокувати екран

3 Розблокувати екран

4 Натиснути кнопку Ноті (Додому) (яка поверне вас на стартовий екран ОС)

5 В екрані Ноті (Стартовий екран) утримувати кнопку Ноті (Додому), доки на екрані не зявиться список запущених додатків Виберіть програму Android Basics Start для його поновлення (це поверне вас на екран тестової активності)

6 Натиснути кнопку Назад (це поверне вас на стартову активність)

Якщо система не вирішить знищити вашу активність без повідомлення в будь-який момент, коли вона знаходиться в загальмованому стані, ви побачите на екрані щось, схоже на рис 44 (якщо, звичайно, ще не вийшли з активності кнопкою Назад)

Рис 44 Працююча активність LifeCycleTest

При запуску активності викликається метод onCreate, далі йде onResume При блокуванні дисплея викликається onPauseO, при розблокуванні – onResumeO Натиснувши кнопку Ноті (Додому), ми запускаємо метод onPause Повернення до активності знову тягне за собою виклик onResume Ті ж повідомлення показані в LogCat – ви можете побачити їх у поданні LogCat в Eclipse На рис 45 зображено все, що ми записали в LogCat при виконанні розглянутої вище послідовності дій (плюс натискання кнопки Назад)

Рис 45 Висновок в LogCat активності LifeCycleTest

Як бачите, натискання кнопки Назад активізує метод onPause Він також знищує активність – перевірка в onPause повідомляє нам, що це останні повідомлення, які ми побачимо від активності

І це все про життєвий цикл активності, спрощеному нами для розробки ігор Тепер ми легко можемо обробляти події постановки на паузу і повернення з неї А також гарантуємо собі оповіщення про знищення активності

Джерело: Mario Zechner / Маріо Цехнер, «Програмування ігор під Android», пров Єгор Сидорович, Євген зазноби, Видавництво «Пітер»

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*