• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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&#64;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&#64;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