Я проверяю, может ли мое приложение восстанавливаться после непредвиденных ситуаций, которые приводят к тому, что ОС завершает процесс моего приложения из-за различных обстоятельств, таких как нехватка памяти. Для этого я включил «Не сохранять действия» в параметрах разработчика.

Я пытаюсь восстановить состояние приложения, сохраняя значения состояния в Activity's Bundle с помощью метода жизненного цикла onSaveInstanceState, но после установки точек останова я заметил, что onSaveInstanceState не вызывается.

Вопрос: Я ошибаюсь, ожидая вызова onSaveInstanceState в этом сценарии, или могут быть другие факторы, препятствующие срабатыванию метода? Если нет, что еще я могу сделать, чтобы восстановить состояние в этом сценарии?

0
Ivan 14 Апр 2020 в 00:43

1 ответ

Я думаю, предполагаются две возможности.

  1. Ваш сценарий неверен

Официальная ссылка гласит:

Не путайте этот метод с обратными вызовами жизненного цикла активности, такими как onPause(), который всегда вызывается, когда пользователь больше не взаимодействует с активностью, или onStop(), который вызывается, когда активность становится невидимой. Одним из примеров, когда вызываются onPause() и onStop(), а не этот метод, является то, что пользователь переходит обратно от действия B к действию A: нет необходимости вызывать onSaveInstanceState(Bundle) для B, потому что этот конкретный экземпляр никогда не будет восстановлен. , поэтому система избегает его вызова. Примером, когда вызывается onPause(), а не onSaveInstanceState(Bundle), является случай, когда действие B запускается перед действием A: система может избежать вызова onSaveInstanceState(Bundle) для действия A, если оно не было уничтожено во время существования B, поскольку состояние пользовательского интерфейса A останется нетронутым.

Если в вашем сценарии нет необходимости звонить, onSaveInstanceState не будет вызываться.

  1. Ваши точки останова неверны

При вызове этот метод будет выполняться после onStop() для приложений, предназначенных для платформ, начинающихся с Build.VERSION_CODES.P. Для приложений, ориентированных на более ранние версии платформы, этот метод будет выполняться до onStop(), и нет никаких гарантий относительно того, произойдет ли он до или после onPause().

Таким образом, время вызова onSaveInstanceState зависит от вашей целевой платформы.

Простой обходной путь — сделать резервную копию данных с помощью SharedPreference и т. д. в onPause.

0
hata 14 Апр 2020 в 12:11