1page.title=Воссоздание операции 2page.tags=жизненный цикл операции 3helpoutsWidget=true 4 5trainingnavtop=true 6 7@jd:body 8 9<div id="tb-wrapper"> 10 <div id="tb"> 11 12 <h2>Содержание этого урока</h2> 13 <ol> 14 <li><a href="#SaveState">Сохранение состояния операции</a></li> 15 <li><a href="#RestoreState">Восстановление состояния операции</a></li> 16 </ol> 17 18 <h2>См. также:</h2> 19 <ul> 20 <li><a href="{@docRoot}training/basics/supporting-devices/screens.html">Поддержка 21различных экранов</a></li> 22 <li><a href="{@docRoot}guide/topics/resources/runtime-changes.html">Обработка изменений в режиме выполнения</a></li> 23 <li><a href="{@docRoot}guide/components/activities.html">Операции</a> 24 </li> 25 </ul> 26 27 </div> 28</div> 29 30<p>Существуют ситуации, когда операция уничтожается в результате нормального поведения приложения. Например, это происходит, 31когда пользователь нажимает кнопку <em>Назад</em> или когда операция подает сигнал о своем уничтожении 32посредством вызова {@link android.app.Activity#finish()}. Система также может уничтожить операцию, 33если она остановлена и не используется в течение длительного времени, или если для выполнения операции на экране требуется больше 34системных ресурсов и системе нужно закрыть фоновые процессы для освобождения памяти.</p> 35 36<p>Если операция уничтожается при нажатии пользователем кнопки <em>Назад</em> или завершении 37операции, система считает, что экземпляр {@link android.app.Activity} исчезает навсегда, 38так как такое поведение указывает, что операция больше не нужна. Однако если система уничтожает 39операцию в связи с системными ограничениями (а не в процессе обычной работы приложения), хотя фактический 40{@link android.app.Activity} экземпляр исчезает, система помнит о его существовании, и если 41пользователь вернется к нему, система создаст новый экземпляр действия, используя набор 42сохраненных данных, описывающий состояние операции на момент ее уничтожения. Сохраненные данные, используемые 43системой для восстановления предыдущего состояния, называются "состоянием экземпляра" и представляют собой набор 44пар "ключ-значение", хранящийся в объекте {@link android.os.Bundle}.</p> 45 46<p class="caution"><strong>Внимание!</strong> Ваша операция будет уничтожаться и восстанавливаться каждый раз, 47когда пользователь вращает экран. При изменении ориентации экрана система уничтожает и заново создает 48активную операцию, поскольку конфигурация экрана меняется и операции может потребоваться 49загрузка альтернативных ресурсов (например нового макета).</p> 50 51<p>По умолчанию система использует состояние экземпляра {@link android.os.Bundle} для сохранения информации 52о каждом объекте {@link android.view.View} в макете операции (например, о текстовом значении, 53введенном в объект {@link android.widget.EditText}). Таким образом, если экземпляр вашей операции уничтожается и 54воссоздается заново, происходит восстановление предыдущего состояния макета, 55и при этом вам не нужно добавлять в приложение дополнительный код. Однако операция 56может содержать больше информации о состоянии, чем вы хотите восстановить, например переменные, 57отслеживающие ход выполнения операции пользователем.</p> 58 59<p class="note"><strong>Примечание.</strong> Чтобы система Android могла восстановить состояние 60представлений операции, <strong>каждое представление должно иметь уникальный идентификатор</strong>, предоставляемый атрибутом 61<a href="{@docRoot}reference/android/view/View.html#attr_android:id">{@code 62android:id}</a>.</p> 63 64<p>Для сохранения дополнительных данных о состоянии операции, необходимо 65заменить метод обратного вызова {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}. 66Система вызывает этот метод, когда пользователь покидает операцию, 67и передает ему объект {@link android.os.Bundle}, который будет сохранен в 68случае, если операция будет неожиданно уничтожена. Если 69системе нужно будет воссоздать экземпляр экземпляра операции, она передаст тот же объект {@link 70android.os.Bundle} методам {@link android.app.Activity#onRestoreInstanceState 71onRestoreInstanceState()} и {@link android.app.Activity#onCreate onCreate()}. 72</p> 73 74<img src="{@docRoot}images/training/basics/basic-lifecycle-savestate.png" /> 75<p class="img-caption"><strong>Рисунок 2</strong>. Когда система начинает останавливать операцию, она 76вызывает {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} (1), чтобы вы могли указать 77дополнительные данные состояния, которые нужно сохранить на случай необходимости воссоздания экземпляра {@link android.app.Activity}. 78Если операция будет уничтожена, 79и системе нужно будет воссоздать тот же экземпляр, она передаст данные 80состояния, определенные в (1), методам {@link android.app.Activity#onCreate onCreate()} 81(2) и {@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} 82(3).</p> 83 84 85 86<h2 id="SaveState">Сохранение состояния операции</h2> 87 88<p>Когда начинается остановка операции, система вызывает метод {@link android.app.Activity#onSaveInstanceState 89onSaveInstanceState()}, чтобы операция могла сохранить информацию о состоянии с помощью набора пар 90"ключ-значение". По умолчанию при реализации этого метода сохраняется информация о состоянии иерархии 91представления операции, например текст в виджете {@link android.widget.EditText} или положение экрана 92для {@link android.widget.ListView}.</p> 93 94<p>Для сохранения дополнительной информации о состоянии операции 95необходимо реализовать {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} и добавить 96к объекту {@link android.os.Bundle} пары "ключ-значение". Например:</p> 97 98<pre> 99static final String STATE_SCORE = "playerScore"; 100static final String STATE_LEVEL = "playerLevel"; 101... 102 103@Override 104public void onSaveInstanceState(Bundle savedInstanceState) { 105 // Save the user's current game state 106 savedInstanceState.putInt(STATE_SCORE, mCurrentScore); 107 savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); 108 109 // Always call the superclass so it can save the view hierarchy state 110 super.onSaveInstanceState(savedInstanceState); 111} 112</pre> 113 114<p class="caution"><strong>Внимание!</strong> Реализацию суперкласса {@link 115android.app.Activity#onSaveInstanceState onSaveInstanceState()} следует вызывать во всех случаях, чтобы реализация 116по умолчанию могла сохранить состояние новой иерархии.</p> 117 118 119 120<h2 id="RestoreState">Восстановление состояния операции</h2> 121 122<p>В случае воссоздания операции после предыдущего уничтожения сохраненное 123состояние можно восстановить из {@link android.os.Bundle}, куда система 124передает данные операции. Методы обратного вызова {@link android.app.Activity#onCreate onCreate()} и {@link 125android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} получают один и 126тот же {@link android.os.Bundle}, содержащий информацию о состоянии экземпляра.</p> 127 128<p>Поскольку метод {@link android.app.Activity#onCreate onCreate()} вызывается, если 129система создает новый экземпляр операции или восстанавливает предыдущий экземпляр, перед попыткой чтения необходимо убедиться, 130что {@link android.os.Bundle} имеет состояние null. В этом случае 131система создает новый экземпляр операции 132вместо восстановления ранее уничтоженного экземпляра.</p> 133 134<p>Приведем пример восстановления некоторых данных о состоянии в {@link android.app.Activity#onCreate 135onCreate()}:</p> 136 137<pre> 138@Override 139protected void onCreate(Bundle savedInstanceState) { 140 super.onCreate(savedInstanceState); // Always call the superclass first 141 142 // Check whether we're recreating a previously destroyed instance 143 if (savedInstanceState != null) { 144 // Restore value of members from saved state 145 mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 146 mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 147 } else { 148 // Probably initialize members with default values for a new instance 149 } 150 ... 151} 152</pre> 153 154<p>Вместо восстановления состояния в {@link android.app.Activity#onCreate onCreate()} вы 155можете реализовать метод {@link 156android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}, который система вызывает 157после метода {@link android.app.Activity#onStart()}. Система вызывает {@link 158android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} только при наличии сохраненного состояния 159для восстановления, и поэтому вам не нужно проверять, имеет ли {@link android.os.Bundle} значение null:</p> 160 161<pre> 162public void onRestoreInstanceState(Bundle savedInstanceState) { 163 // Always call the superclass so it can restore the view hierarchy 164 super.onRestoreInstanceState(savedInstanceState); 165 166 // Restore state members from saved instance 167 mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 168 mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 169} 170</pre> 171 172<p class="caution"><strong>Внимание!</strong> Реализацию суперкласса {@link 173android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} следует вызывать во всех случаях, чтобы реализация 174по умолчанию могла сохранить состояние новой иерархии.</p> 175 176<p>Более подробную информацию о воссоздании операции в связи 177с перезапуском во время исполнения (например при повороте экрана) можно найти в разделе <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Обработка изменений в режиме выполнения</a>.</p> 178 179