• 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="#Stop">Остановка операции</a></li>
15      <li><a href="#Start">Запуск/перезапуск операции</a></li>
16    </ol>
17
18    <h2>См. также:</h2>
19    <ul>
20      <li><a href="{@docRoot}guide/components/activities.html">Операции</a>
21      </li>
22    </ul>
23
24<h2>Попробуйте сами</h2>
25
26<div class="download-box">
27 <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">Загрузить демонстрацию</a>
28 <p class="filename">ActivityLifecycle.zip</p>
29</div>
30
31  </div>
32</div>
33
34<p>Правильное выполнение остановки и перезапуска операции является важным шагом в жизненном
35цикле операции, благодаря которому пользователи понимают, что приложение не потеряет их данные.
36Ниже приведен пример нескольких основных ситуаций с остановкой и перезапуском операции.</p>
37
38<ul>
39  <li>Пользователь открывает окно "Последние приложения" и переключается из вашего приложения в другое приложение.
40При этом останавливается операция вашего приложения, работающего на экране. Если пользователь возвращается в ваше
41приложение, нажав значок запуска на главном экране или через окно "Последние приложения", данная операция возобновляется.</li>
42  <li>Пользователь выполняет в вашем приложении действие, запускающее новую операцию. Текущая операция
43останавливается при создании второй операции. Если после этого пользователь нажимает кнопку <em>Назад</em>
44, первая операция запускается заново.</li>
45  <li>Пользователь получает телефонный звонок или переключается на другое приложение во время использования вашего приложения на своем телефоне.</li>
46</ul>
47
48<p>Класс {@link android.app.Activity} предоставляет два метода жизненного цикла, {@link
49android.app.Activity#onStop()} и {@link android.app.Activity#onRestart()}, позволяющие явно
50обрабатывать остановку и перезапуск операции. В отличие от состояния паузы,
51означающем частичное уничтожение пользовательского интерфейса, в состоянии остановки пользовательский интерфейс больше не
52отображается и пользователь переключается на отдельную операцию (или отдельное приложение).</p>
53
54<p class="note"><strong>Примечание.</strong> Поскольку система хранит ваш экземпляр {@link android.app.Activity}
55в системной памяти при остановке, вам, возможно, вообще не потребуется реализация методов
56{@link android.app.Activity#onStop()} и {@link android.app.Activity#onRestart()} (или даже {@link
57android.app.Activity#onStart()}. Большинство операций относительно простые, и операция
58остановится и перезапустится нормально, вам только может потребоваться {@link
59android.app.Activity#onPause()} для приостановки текущих операций и отключения от системных ресурсов.</p>
60
61<img src="{@docRoot}images/training/basics/basic-lifecycle-stopped.png" />
62<p class="img-caption"><strong>Рисунок 1.</strong> Когда пользователь выйдет из операции, система
63вызовет {@link android.app.Activity#onStop onStop()} для остановки операции (1). Если пользователь возвращается
64при остановке операции, система вызывает {@link android.app.Activity#onRestart onRestart()}
65(2), затем сразу же {@link android.app.Activity#onStart onStart()} (3) и {@link
66android.app.Activity#onResume()} (4). Вне зависимости от причины остановки
67операции, система всегда вызывает {@link android.app.Activity#onPause onPause()} перед вызовом {@link
68android.app.Activity#onStop onStop()}.</p>
69
70
71
72<h2 id="Stop">Остановка операции</h2>
73
74<p>Когда операция получает вызов метода {@link android.app.Activity#onStop()},
75она становится невидимой и освобождает практически все ресурсы, которые не нужны ей, когда пользователь ее не
76использует. После остановки операции система может уничтожить экземпляр, если ей потребуется
77освободить системную память. В чрезвычайных ситуациях система может закрыть процесс приложения без
78вызова последнего метода обратного вызова {@link android.app.Activity#onDestroy()} операции, и поэтому важно
79использовать {@link android.app.Activity#onStop()} для высвобождения ресурсов, которые могут вызвать утечку памяти.</p>
80
81<p>Хотя метод {@link android.app.Activity#onPause onPause()} вызывается до
82{@link android.app.Activity#onStop()}, вам следует использовать {@link android.app.Activity#onStop onStop()}
83для выполнения более масштабных операций выключения с использованием процессорных ресурсов, например при записи информации в базу
84данных.</p>
85
86<p>В качестве примера приведем реализацию {@link android.app.Activity#onStop onStop()},
87сохраняющую содержание черновой заметки в постоянное хранилище:</p>
88
89<!-- TODO: Find a better example for onStop, because this kind of thing should probably use a
90separate thread but that's too complicated to show here. -->
91<pre>
92&#64;Override
93protected void onStop() {
94    super.onStop();  // Always call the superclass method first
95
96    // Save the note's current draft, because the activity is stopping
97    // and we want to be sure the current note progress isn't lost.
98    ContentValues values = new ContentValues();
99    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
100    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
101
102    getContentResolver().update(
103            mUri,    // The URI for the note to update.
104            values,  // The map of column names and new values to apply to them.
105            null,    // No SELECT criteria are used.
106            null     // No WHERE columns are used.
107            );
108}
109</pre>
110
111<p>При остановке операции объект {@link android.app.Activity} остается в памяти
112и вызывается повторно при возобновлении операции. Не нужно заново инициализировать компоненты,
113созданные с использованием любого из методов обратного вызова для возобновления операции. Система также
114отслеживает текущее состояние каждого {@link android.view.View} в макете, и если
115пользователь вводит текст в виджет {@link android.widget.EditText}, этот текст сохраняется, так что его не
116нужно специально сохранять и восстанавливать.</p>
117
118<p class="note"><strong>Примечание.</strong> Даже если система уничтожит операцию в период остановки,
119она сохранит состояние объектов {@link android.view.View} (например, текста в {@link
120android.widget.EditText}) в {@link android.os.Bundle} (наборе пар "ключ-значение") и восстановит
121их, если пользователь вернется в тот же экземпляр операции (на <a href="recreating.html">следующем уроке</a> мы более подробно поговорим об использовании {@link android.os.Bundle} для сохранения
122других данных состояния в случае уничтожения и воссоздания вашей операции).</p>
123
124
125
126<h2 id="Start">Запуск/перезапуск операции</h2>
127
128<p>Когда ваша операция возвращается в экранный режим из состояния остановки, она получает вызов
129{@link android.app.Activity#onRestart()}. Система также вызывает метод {@link
130android.app.Activity#onStart()}, что происходит каждый раз, когда операция становится видимой
131(при перезапуске или первоначальном создании). Однако метод {@link
132android.app.Activity#onRestart()} вызывается только при возобновлении операции из состояния
133остановки, так что его можно использовать для выполнения специальных задач восстановления, которые могут требоваться только если операция
134была остановлена, но не была уничтожена.</p>
135
136<p>Приложениям редко требуется использовать {@link android.app.Activity#onRestart()} для восстановления
137состояния операции, и поэтому для этого метода нет правил, относящихся
138к обычным приложениям. Однако поскольку ваш метод {@link android.app.Activity#onStop()}
139должен фактически освободить все ресурсы операции, их нужно снова выделить
140при перезапуске операции. Однако их также нужно выделять при первом
141создании операции (когда нет существующего экземпляра операции). По этому причине обычно
142используют метод обратного вызова {@link android.app.Activity#onStart()} в дополнение
143к методу {@link android.app.Activity#onStop()}, поскольку система вызывает {@link
144android.app.Activity#onStart()} как при создании операции, так и при ее перезапуске
145после остановки.</p>
146
147<p>Например, если пользователь долго не пользовался приложением,
148а затем вернулся в него, метод {@link android.app.Activity#onStart()} хорошо помогает убедиться, что требуемые
149системные функции включены:</p>
150
151<pre>
152&#64;Override
153protected void onStart() {
154    super.onStart();  // Always call the superclass method first
155
156    // The activity is either being restarted or started for the first time
157    // so this is where we should make sure that GPS is enabled
158    LocationManager locationManager =
159            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
160    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
161
162    if (!gpsEnabled) {
163        // Create a dialog here that requests the user to enable GPS, and use an intent
164        // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
165        // to take the user to the Settings screen to enable GPS when they click "OK"
166    }
167}
168
169&#64;Override
170protected void onRestart() {
171    super.onRestart();  // Always call the superclass method first
172
173    // Activity being restarted from stopped state
174}
175</pre>
176
177
178
179
180<p>Когда система уничтожает вашу операцию, она вызывает метод {@link android.app.Activity#onDestroy()}
181для вашего {@link android.app.Activity}. Поскольку вы уже освобождаете большую часть
182ресурсов с помощью {@link android.app.Activity#onStop()} к моменту вызова {@link
183android.app.Activity#onDestroy()}, большинству приложений почти ничего не нужно делать. Этот метод представляет собой последний
184шанс освободить ресурсы, могущие привести к утечке памяти, обеспечивая уверенность
185в уничтожении дополнительных потоков и других долгосрочных действий, например, отслеживания
186методов.</p>
187
188