Воссоздание активности в Android Eclipse SDK

При разработке под android, есть несколько сценариев, в которых деятельность уничтожается во время нормального поведения приложения: например, когда пользователь нажимает кнопку "Назад" или когда деятельность сигнализирует о саморазрушении, вызывая Finish (). Система также может разрушить деятельность, если она в настоящее время остановилась и не была использована в течение длительного времени: скажем, деятельность первого плана требует больше ресурсов, поэтому система должна закрыть фоновые процессы для восстановления памяти.

Этот урок научит вас

  1. Сохранять состояние активности
  2. Восстанавливать состояние деятельности

Вы также должны прочитать

  • Поддержка различных экранов
  • Обработка выполнения изменений
  • Виды деятельности

Когда деятельность уничтожена при нажатии кнопки "Назад" или активность заканчивается сама, концепция системы заключается в том, что экземпляр Activity исчезает, потому что поведение указывает на то, что деятельность больше не нужна. Однако, если система разрушает активность из-за ограничений системы Eclipse Android (а не ввиду нормального поведения приложения), то, хотя фактически Activity устраняется, система помнит, что она существовала. Поэтому, если пользователь пытается вернуться к ней, система создает новую активность с использованием набора сохраненных данных, которые описывают состояние активности, когда она была разрушен. Сохраненные данные, которые система в Android SDK использует для восстановления предыдущего состояния, называются «состояние экземпляра» и представляют собой набор пар ключ-значение и хранятся в объекте Bundle.

Внимание: Ваша деятельность в Android будет уничтожена и создана всякий раз, когда пользователь вращается к экрану. При изменении ориентации экрана, система разрушает и воссоздает приоритетное направление деятельности, потому как конфигурация экрана изменилась и вашей деятельности может потребоваться загрузка альтернативных ресурсов (например, макета).

По умолчанию, система использует экземпляр состояния Bundle, чтобы сохранить информацию о каждом виде объекта в деятельности макета в  Eclipse Android (например, текстовое значение вступило в EditText объекта). Так что, если экземпляр уничтожается и воссоздается, состояние макета восстановится в своем прежнем состоянии, без кода, необходимого вам. Тем не менее, деятельность, возможно, будет содержать сведения о состоянии, которое вы хотели бы восстановить: например, это могут быть переменные-члены, которые позволяют отслеживать прогресс пользователя в деятельности.

Примечание: Для того, чтобы система Android восстановила состояния просмотра деятельности, каждое представление в Android SDK должно иметь уникальный ID, поставляемый атрибутом Android:ID.

Для сохранения дополнительных данных о деятельности, при разработке под android необходимо переопределить метод обратного вызова onSaveInstanceState (). Система вызывает этот метод, когда пользователь покидает деятельность и передает объект Bundle, который будет сохранен в том случае, если ваша деятельность будет неожиданно удалена. Если система должна восстановить активность позже, она передает тот же объект как onRestoreInstanceState () и OnCreate () методы.

Рисунок 2. Поскольку система может остановить вашу деятельность, она вызывает onSaveInstanceState (), поэтому вы можете указать в Android SDK дополнительные данные о состоянии, которые вы хотели бы сохранить в случае, если экземпляр Activity должен быть воссоздан. Если деятельность разрушается и тот же экземпляр должен быть воссоздан, система передает данные о состоянии, указанные в как к OnCreate () и onRestoreInstanceState ().

Сохранение состояния активности

Как только деятельность начинается, для того, чтобы ее остановить, система в Eclipse Android вызывает onSaveInstanceState (), таким образом деятельность может сохранить информацию о состоянии пар ключ-значение. Этот метод, при разработке в андроид, сохраняет информацию о состоянии деятельности иерархии, скажем, текста в виджете  EditText или положения прокрутки ListView .

Чтобы сохранить дополнительную информацию о состоянии деятельности, вы должны реализовать onSaveInstanceState () и добавить в Eclipse Android пар ключ-значение в объект 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);
}

Внимание: Всегда вызывайте в Eclipse Android суперкласс onSaveInstanceState () -- по умолчанию реализация может сохранить состояние с точки зрения иерархии.

Восстановление состояния деятельности 

Когда деятельность после того, как был ранее уничтожена, вы можете восстановить состояние от Bundle, которое система передает в деятельность. Оба метода обратного вызоваOnCreate () и onRestoreInstanceState (), получают Bundle , который содержит информацию о состояния экземпляра.

Поскольку метод  OnCreate () создает новый экземпляр деятельности или воссоздает предыдущую, вы должны проверить, что состояние Bundle является недействительным, прежде чем пытаться прочитать его. Если оно равно нулю, система создает новый экземпляр активности, вместо того чтобы восстановить предыдущий, который был разрушен.

Например, разработке под android, можно восстановить некоторые данные о состоянии 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 (), в Android SDK вы можете выбрать для реализации onRestoreInstanceState (), который система вызывает после метода onStart (). Система вызывает onRestoreInstanceState () только при наличии сохраненного состояния восстановления, так что вам не нужно проверять, является ли значение Bundle пустым:

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 () так, чтобы реализацию по умолчанию можно было восстановить в состояние с точки зрения иерархии.