Сохранение представления данных / макета в Android после поворота экрана / уничтожения активности
Я немного смущен Activity
уничтожается и воссоздается при повороте устройства пользователя.
Я читал вокруг, и я понимаю обоснование для этого (это в основном "заставляет" разработчика, чтобы убедиться, что они ничего не "пропустили" при ротации / язык / другие изменения)
Я рад уважать лучшую практику, если она рассматривается как таковая, однако возникает вопрос:
Как мне "запомнить" состояние игры / приложения, чтобы при повороте экрана у меня было что-то, из чего можно заново сгенерировать то, на что смотрел пользователь?
Из того, что я вижу, абсолютно все разрушено, запускается конструктор базового класса и все переменные в Activity
являются "нулевыми".
Я подозреваю, что 'saveInstanceState' (Bundle
class), где я собираю эти данные, но чтение вокруг них, кажется, используется только тогда, когда приложение закрыто из-за нехватки ресурсов (и нескольких других крайне ограниченных случаев)
Я дезинформирован или неправильно понял цель saveInstanceState? Разумно ли отказаться от лучших практик (позволяя Activity
быть уничтоженным) если я достаточно внимателен, чтобы ничего не пропустить при вращении? Спасибо заранее за любые советы.
Должен отметить, что этот вопрос относится к программированию игр (я не использую макет XML)
2 ответа
Вам нужно воссоздать свою деятельность? Есть ли работа, которую вы хотите сделать на ротации? saveInstanceState - это место, где вы будете хранить данные для передачи в воссоздание Activity, но, поскольку вы не используете макеты XML, вы можете просто добавить android:configChanges="direction" к своей активности в манифесте. Это даст вам ручное управление тем, что происходит во время смены поворота.
В дополнение к моему первоначальному комментарию я бы отменил изменения конфигурации для отображаемой клавиатуры:
android:configChanges="orientation|keyboardHidden"
Если есть работа, которую вы хотите сделать с изменением поворота, вы можете переопределить onConfigChange
и делать все, что вам нужно там.
Трудно сказать, что есть время, когда вы всегда должны переопределять изменения конфигурации, но я часто делаю это, когда у меня нет зависимости от папок ресурсов, которые зависят от размера или ориентации, и я делаю много работы, которая потребует слишком много время воссоздать.
Существуют и другие рекомендации по хранению данных при изменении конфигурации activitiy.
1. Документ разработчика, обрабатывающий изменения времени выполнения
2. Алекс Локвуд: Обработка изменений конфигурации с фрагментами. Это ответит на все ваши вопросы, касающиеся изменения конфигурации и хранения данных.
Impt: файл фрагмента для хранения данных. Вы должны установить setRetainInstace(true)
для того, чтобы хранить данные и извлекать их во время изменения конфигурации вашей деятельности.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}