Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаборторна робота №3.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.88 Mб
Скачать

Збереження даних між поворотами

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 для звільнення пам'яті.