Android: сохранение состояния в течение жизненного цикла Android - PullRequest
3 голосов
/ 28 января 2011

Я ссылаюсь на http://developer.android.com/reference/android/app/Activity.html.

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

Так как я могу сохранить свое состояние?Должен ли я сделать это при вызове новой активности?Но как?
Единственный способ, которым я могу придумать, - это сохранить состояние путем передачи состояния в новое действие, ничего не делать там с сохраненными данными, вернуть его в первое действие и восстановить состояние в onActivitResult.Но это означало бы, что я должен передавать данные туда и обратно только для восстановления состояния.Не кажется хорошим решением.

Ответы [ 3 ]

6 голосов
/ 28 января 2011

Вероятно, это плохой ответ, но вы уверены, что onRestoreInstanceState нужно вызвать?

Точка связки и onSaveInstanceState / onCreate с связкой / onRestoreInstanceState - для сохранения переходных данныхдля действия, которое находится в стеке истории, в случае, если действие должно быть уничтожено, чтобы освободить часть памяти.Если оно убито, действие можно восстановить, как если бы оно никогда не было убито, с помощью onCreate / onRestonreInstanceState. Однако, если действие не было прекращено, возможно, нет необходимости восстанавливать его временные данные - предположительно, оно такое же, как и было.

Документация AndroidОбратите внимание, что onSaveInstanceStae / onRestoreInstanceState являются , а не методами жизненного цикла , поэтому не обязательно вызывать их при переходах состояний жизненного цикла.Если вам нужно подключиться к определенным переходам жизненного цикла, взгляните на методы ловушки жизненного цикла .Например, onResume вызывается, когда действие становится активностью на переднем плане, и onPause вызывается, когда оно больше не является активностью на переднем плане.

Android Lifecycle Picture

4 голосов
/ 28 января 2011

Взгляните на Основы применения , а именно на эту часть:

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

Поскольку onSaveInstanceState() вызывается не всегда, его следует использовать только для записи переходного состояния.деятельности, а не хранить постоянные данные.Вместо этого используйте onPause().

По сути, любые постоянные данные должны быть записаны в вашем методе onPause() и считаны обратно в onResume().В статье Хранение данных приведены способы сохранения данных.

1 голос
/ 29 января 2011

Ваш ListView не следует очищать после возврата с экрана Pref, если только действие не было уничтожено во время отображения экрана Pref (в этом случае onCreate должен был быть вызван с сохраненным пакетом).

saveInstanceState используется только в том случае, если действие было уничтожено и нуждается в воссоздании. В этом случае похоже, что ваша ListActivity не была уничтожена.

Вы очищаете свой ListView вручную где-нибудь?

...