Клавиша возврата Android не позволяет мне сохранять состояние активности

Быстрый вопрос. У меня есть действие, которое вызывает мою функцию сохранения в нужные моменты, onPause и onSavedInstance. OnPause происходит, если активность покидает передний план и onSavedInstance перед уничтожением.

Моя активность отлично сохраняет состояние, если пользователь нажимает клавишу «домой», но если он нажимает клавишу «назад», onPause все еще происходит, и, следовательно, некоторые поля сохраняются в атрибутах класса активности.

Проблема в том, что когда пользователь возвращается к действию, onCreate вызывается, что означает (насколько я понял), что класс создается экземпляром, и поэтому его атрибуты снова равны нулю. Если бы onSavedInstance был вызван, когда ранее была нажата клавиша «Назад», я мог бы использовать его для сохранения состояния активности, но это не так.

Итак, мой вопрос: когда пользователь нажимает клавишу «Назад», как я могу сохранить состояние активности без использования sqlite, сохранения файлов и других методов сохранения?


person out_sid3r    schedule 09.10.2011    source источник


Ответы (1)


Когда пользователь нажимает кнопку НАЗАД, ваша активность на переднем плане уничтожается. Это действие будет вызываться с помощью onPause(), onStop() и onDestroy(). Затем этот объект активности будет удален сборщиком мусора (если только вы не допустили утечку памяти).

onSaveInstanceState() будет вызываться периодически, если есть вероятность того, что действие будет вскоре уничтожено, но таким образом, чтобы пользователь мог вернуться к нему. Наиболее часто это происходит при изменении конфигурации, например при повороте экрана.

То, что вы должны делать в onPause(), во всяком случае, это сохранение данных с использованием «sqlite, сохранения файлов и других методов сохранения». После вызова onPause() нет никаких гарантий, что эта активность будет продолжаться или что весь ваш процесс будет продолжаться. Поэтому все, что вы цените, должно быть записано в постоянное хранилище.

«Состояние» для onSaveInstanceState() — это то, что влияет на пользовательский интерфейс активности, но не является частью постоянной модели данных. Многое из этого обрабатывается за вас автоматически встроенной реализацией этого метода в Android (например, текст в EditText), но вы можете добавить свою собственную информацию в Bundle, если хотите. Однако состояние вашего экземпляра не является вашей моделью данных, поэтому все, что вы хотите сохранить, должно быть записано в постоянное хранилище.

Если вас беспокоит производительность, вы можете кэшировать данные в статических элементах данных/синглетонах, если вы не создаете утечку памяти. Но опять же, после вызова onPause() ваш процесс может быть остановлен в любой момент времени. Ваши статические элементы данных могут быть только кешем; ваша модель данных должна быть чем-то постоянным.

person CommonsWare    schedule 09.10.2011