2015-08-24 4 views
6

Я новичок в андроиде, и я прочитал книгу для новичков, в которой говорится, что onSaveInstanceState(Bundle) будет называться до того, как система восстановит ваш Activity. Я попробовал это на некоторых тестовых кодах и нашел его неправильным. Я обнаружил, что onSaveInstanceState(Bundle) был вызван каждый раз после вызова onPause(). И это не имеет никакого отношения к рекуперации системы. Я не очень уверен в этом, так вот в чем вопрос: когда onSaveInstanceState(Bundle) называется на самом деле?Вызывается метод onSaveInstanceState (Bundle) после onPause()?

+0

Вы должны прочитать о жизненном цикле деятельности. Вот диаграмма: http://i.stack.imgur.com/EVuKo.png – dazito

+0

Спасибо, дазито. Я думаю, что я просто понял вашу картину: 'onPause()' сам должен быть вызван до того, как система будет убивать Activity, поэтому поэтому 'onSaveInstanceState (Bundle)' также обеспечивается. Но я заметил, что 'onStop()', безусловно, будет вызываться в течение меньшего времени, чем 'onPause()' за один жизненный цикл, а также 'onStop()' также будет вызван, прежде чем система убьет Activity. Итак, почему 'onSaveInstanceState (Bundle)' всегда соединяется с 'onPause()', но не 'onStop()'? Почему 'onSaveInstanceState (Bundle)' следует вызывать так много раз? Похоже, что это пустая трата ресурсов для системы. –

+1

Поскольку у вас может быть другое действие, занимающее место (на экране) вашего текущего действия, поэтому вызывается onPause(). Из Android Docs: «Например, когда открывается полупрозрачная активность (например, одна в стиле диалога), предыдущая активность приостанавливается. Пока активность все еще частично видима, но в настоящее время это не активность в фокусе, она остается приостановленной. 'Http://developer.android.com/training/basics/activity-lifecycle/pausing.html Я рекомендую вам переопределить всю активность жизненные циклы и играть, чтобы вы могли приостановить/возобновить действие/остановить/уничтожить и т. д. – dazito

ответ

1

По Android Documentation:

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

Да onPause() вызывается до onSaveInstanceState(Bundle). Но onPause() гарантированно будет вызван в качестве своей части деятельности life cycle

Обычно, когда ваша деятельность будет создан заново, например, при изменении ориентации устройства, то onSaveInstanceState(Bundle) вызывается, если вы не указали android:configChanges тег в файле manifest.xml.

2

Я не согласен с предыдущим ответом.
Согласно Documentation:

При вызове, этот метод будет происходить до OnStop(). Нет гарантии о том, произойдет ли это до или после onPause().

+0

Как важное примечание, 'onSaveInstanceState()' может вызываться до 'onPause()'. Возможно, это связано с тем, что фрагмент (поддержка), который я использую, находится в 'ViewPager'. Надеюсь, это полезно для кого-то другого. – Sufian

Смежные вопросы