В этом уроке
Вы также должны прочитать
Есть несколько сценариев, в которых ваша activity разрушается в результате нормального поведения приложения, например, когда пользователь нажимает кнопку Назад или ваша activity сигнализирует о собственном разрушении, вызвав finish()
. Система может также разрушить вашу activity , если она в настоящее время остановлена, и не использовалась в течение длительного времени, или activity на переднем плане требует больше ресурсов, так что система должна остановить фоновые процессы для восстановления памяти.
Когда ваша activity уничтожается, потому что пользователь нажимает Назад или activity завершает себя, концепция системы относительно Activity
экземпляра – уничтожен навсегда, потому что поведение указывает на activity , которая больше не нужна. Однако, если система разрушает activity из-за системных ограничений (а не согласно нормальному поведению приложения), то хотя фактически Activity
экземпляр пропал, система помнит, что он существовал, и если пользователь переходит обратно, система создает новый экземпляр activity с использованием набора сохраненных данных, который описывает состояние activity , когда она была разрушена. Сохраненные данные, которые система использует для восстановления предыдущего состояния называется “состоянием экземпляра” и представляет собой набор пар ключ-значение, хранящиеся в Bundle
объекте.
Внимание: Ваша activity будет уничтожена и создана заново каждый раз, когда пользователь вращает экран. Когда на экране меняется ориентация, система разрушает и воссоздает activity на переднем плане, потому что конфигурация экрана изменилась, и вашей activity возможно необходимо загрузить альтернативные ресурсы (например, макет).
По умолчанию система использует Bundle
экземпляр, чтобы сохранить информацию о каждомView
объекте в макете activity (таких как, текст введенный в EditText
объект). Так что, если ваш экземпляр activity уничтожен и создан заново, состояние макета восстанавливается в прежнее состояние, без необходимости писать код с вашей стороны. Тем не менее, ваша activity может иметь больше информации о состоянии, которую вы хотели бы восстановить, например, переменные члены класса, которые позволяют отслеживать движение пользователя в деятельности.
Примечание: Для того, чтобы Android система восстановила состояние представлений в вашей activity , каждое представление должно иметь уникальный идентификатор, задаваемый вandroid:id
атрибуте.
Чтобы сохранить дополнительные данные о состоянии activity , необходимо перегрузитьonSaveInstanceState()
метод обратного вызова. Система вызывает этот метод, когда пользователь покидает вашу activity , и передает в него Bundle
объект, который будет сохранен в том случае, если ваша activity будет неожиданно разрушена. Если система должна восстановить экземпляр activity позже, он передает тот же Bundle
объект в оба onRestoreInstanceState()
и onCreate()
метода.
Сохранение состояния вашей activity
Когда ваша activity начинает останавливаться, система вызывает onSaveInstanceState()
, так что ваша activity может сохранить информацию о состоянии в виде коллекции пар ключ-значение. Реализация по умолчанию этого метода сохраняет информацию о состоянии представлений иерархии activity , таких как текст из EditText
виджета или положение прокрутки ListView
.
Чтобы сохранить дополнительную информацию о состоянии для вашей activity , вы должны реализовать onSaveInstanceState()
и добавить пары ключ-значение в Bundle
объект. Например:
static final String STATE_SCORE = "playerScore"; static final String STATE_LEVEL = "playerLevel"; ... @Override public void onSaveInstanceState(Bundle savedInstanceState) { // Save the user's current game state savedInstanceState.putInt(STATE_SCORE, mCurrentScore); savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); // Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState(savedInstanceState); }
Внимание: Всегда вызывайте реализацию родительского класса onSaveInstanceState()
, чтобы реализация по умолчанию смогла сохранить состояние представлений иерархии.
[wpanchor id=”2″]
Восстановить состояние вашей activity
Когда ваша activity воссоздана после того, как была ранее уничтожена, вы можете восстановить сохраненное состояние из Bundle
, который система передает в вашу activity . Оба onCreate()
и onRestoreInstanceState()
метода обратного вызова получат то же самый Bundle
, который содержит информацию состояния экземпляра.
Поскольку onCreate()
метод вызывается, когда система создается новый экземпляр вашей activity и когда воссоздает предыдущий, вы должны проверить, равен ли Bundle
состояния null, прежде чем пытаться прочитать его. Если он равен null, то система создает новый экземпляр activity , вместо восстановления предыдущего, который был разрушен.
Например, вот как можно восстановить некоторые данные состояния в onCreate()
:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Always call the superclass first // Check whether we're recreating a previously destroyed instance if (savedInstanceState != null) { // Restore value of members from saved state mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); } else { // Probably initialize members with default values for a new instance } ... }
Вместо восстановления состояния во время выполнения onCreate()
вы можете реализоватьonRestoreInstanceState()
, которой система вызывает после onStart()
метода. Система вызываетonRestoreInstanceState()
только если есть сохраненное состояние для восстановления, так что вам не нужно проверять, равен ли Bundle
значению null:
public void onRestoreInstanceState(Bundle savedInstanceState) { // Always call the superclass so it can restore the view hierarchy super.onRestoreInstanceState(savedInstanceState); // Restore state members from saved instance mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); }
Внимание: Всегда вызывайте реализацию родительского класса onRestoreInstanceState()
, чтобы реализация по умолчанию могла восстановить состояние представлений иерархии.
Чтобы узнать больше о воссоздании вашей activity в связи с событием перезапуска даже во время выполнения (например, когда вращается экране), читайте Обработка изменений времени выполнения.