Клавиша возврата Android не позволяет мне сохранять состояние активности - PullRequest
1 голос
/ 10 октября 2011

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

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

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

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

1 Ответ

1 голос
/ 10 октября 2011

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

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

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

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

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

...