Що економити, а чого не робити?
Ніколи не замислювалися, чому текст у програмі EditText
автоматично зберігається під час зміни орієнтації? Ну, ця відповідь саме для вас.
Коли екземпляр діяльності знищується і система відтворює новий екземпляр (наприклад, зміна конфігурації). Він намагається відтворити його за допомогою набору збережених даних старого стану активності ( стан екземпляра ).
Стан екземпляра - це сукупність пар ключів і значень, що зберігаються в Bundle
об'єкті.
За замовчуванням система зберігає, наприклад, об'єкти View у пакеті.
- Текст в
EditText
- Положення прокрутки в а
ListView
тощо
Якщо вам потрібна інша змінна, яку потрібно зберегти як частину стану екземпляра, слід застосувати метод OVERRIDE onSavedInstanceState(Bundle savedinstaneState)
.
Наприклад, int currentScore
в GameActivity
Більш детально про onSavedInstanceState (пакет збереженихinstaneState) при збереженні даних
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
Тож помилково, якщо ви забудете зателефонувати
super.onSaveInstanceState(savedInstanceState);
за типовою поведінкою, не буде працювати, тобто текст у EditText не збережеться.
Який вибрати для відновлення стану активності?
onCreate(Bundle savedInstanceState)
АБО
onRestoreInstanceState(Bundle savedInstanceState)
Обидва способи отримують один і той же об'єкт Bundle, тому не дуже важливо, де ви пишете свою логіку відновлення. Єдина відмінність полягає в тому, що в onCreate(Bundle savedInstanceState)
методі вам доведеться дати нульову перевірку, поки вона не потрібна в останньому випадку. Інші відповіді вже мають фрагменти коду. Ви можете направити їх.
Детальніше про onRestoreInstanceState (пакет збереженихinstaneState)
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from the saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
}
Завжди дзвоніть, super.onRestoreInstanceState(savedInstanceState);
щоб система відновила ієрархію подання за замовчуванням
Бонус
Система onSaveInstanceState(Bundle savedInstanceState)
викликає систему лише тоді, коли користувач має намір повернутися до Діяльності. Наприклад, ви використовуєте App X і раптом вам дзвонить. Ви переходите до програми, що телефонує, і повертаєтесь до програми X. У цьому випадкуonSaveInstanceState(Bundle savedInstanceState)
буде застосовано метод.
Але врахуйте це, якщо користувач натисне кнопку назад. Передбачається, що користувач не має наміру повертатися до Діяльності, отже, у цьому випадку система onSaveInstanceState(Bundle savedInstanceState)
не буде викликатись. Під час збереження даних слід врахувати всі сценарії.
Відповідні посилання:
Демонстрація стандартної поведінки
Android за замовчуванням .