- •Використання LogCat
- •Повороти і життєвий цикл активності
- •Конфігурації пристроїв і альтернативні ресурси
- •Створення макету для альбомної орієнтації
- •Збереження даних між поворотами
- •Перевизначення onSaveInstanceState(Bundle)
- •Знову про життєвий цикл Activity
- •Виконання(додаток мабуть і знаходиться на передньому плані)
- •Для допитливих: тестування onSaveInstanceState(Bundle)
- •Контрольні запитання
Збереження даних між поворотами
Android дуже намагається надати альтернативні ресурси в потрібний момент. Проте знищення і повторне створення активностей при поворотах може створити проблеми — як, наприклад, у випадку з поверненням до першого питання в додатку GeoQuiz.
Щоб виправити цю помилку, екземпляр QuizActivity, створений після повороту, повинен знати старе значення mCurrentIndex. Нам потрібний механізм збереження даних при зміні конфігурації часу виконання(наприклад, при поворотах). Одно з можливих рішень полягає в перевизначенні методу Activity
protected void onSaveInstanceState(Bundle outState)
Зазвичай цей метод викликається системою перед onPause(), onStop() і onDestroy().
Реалізація за умовчанням onSaveInstanceState(.) наказує усім представленням активності зберегти свій стан в даних об'єкту Bundle — структури, що зв'язує строкові ключі зі значеннями деяких обмежених типів.
Ми вже бачили тип Bundle. Він передається методу onCreate(Bundle) :
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
...
При перевизначенні onCreate(.) ви викликаєте реалізацію onCreate(.) суперкласу активності і передаєте їй тільки що отриманий об'єкт Bundle. У реалізації суперкласу збережений стан представлень витягається і використовується для відтворення ієрархії представлень активності.
Перевизначення onSaveInstanceState(Bundle)
Метод onSaveInstanceState(.) можна перевизначити так, щоб він зберігав додаткові дані в Bundle, а потім знову завантажував їх в onCreate(.). Саме так ми організовуємо збереження значення mCurrentIndex між поворотами.
Спершу додайте в QuizActivity.java константу, яка стане ключем в парі, що зберігається, «ключ-значення».
Лістинг 3.5. Додавання ключа для значення(QuizActivity.java) public class QuizActivity extends Activity, що зберігається {
Нарешті, в методі onCreate(.) слід перевірити це значення, і якщо воно є присутнім — присвоїти його mCurrentIndex.
Лістинг 3.7. Перевірка збережених даних в onCreate(.) (QuizActivity.java)
...
if(savedInstanceState != null) {
mCurrentIndex = savedInstanceState.getInt(KEY _ INDEX, 0);
}
updateQuestion();
}
Запустіть GeoQuiz і натисніть кнопку Next. Скільки б поворотів пристрою ви не виконали, знову створений екземпляр QuizActivity «згадує» поточне питання.
Врахуйте, що для збереження і відновлення з Bundle підходять примітивні типи і об'єкти, що реалізовують інтерфейс Serializable. Створюючи власні класи, які ви плануєте зберігати в onSaveInstanceState(.), не забудьте реалізувати Serializable.
Реалізацію onSaveInstanceState(.) бажано протестувати — особливо якщо ви зберігаєте і відновлюєте об'єкти. Повороти тестуються легко; з тестуванням ситуацій нестачі пам'яті справа йде складніше. У кінці цієї глави приведена інформація про те, як імітувати знищення вашої активності системою Android для звільнення пам'яті.
