Повторное создание Activity

Есть несколько сценариев, в которых ваша 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

Рисунок 2. Поскольку система начинает останавливать вашу activity , она вызываетonSaveInstanceState() (1), вы можете указать дополнительные данные о состоянии, которые вы хотели бы сохранить в случае, когда Activity экземпляр должен быть создан заново. Если activity разрушается и такой же экземпляр должен быть создан заново, система передает данные состояния определённые в (1) как в onCreate() метод (2), так и onRestoreInstanceState() метод (3).

[wpanchor id=”1″]

Сохранение состояния вашей 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 в связи с событием перезапуска даже во время выполнения (например, когда вращается экране), читайте Обработка изменений времени выполнения.

 

Додати коментар