• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Запуск операции
2page.tags=жизненный цикл операции
3helpoutsWidget=true
4
5trainingnavtop=true
6
7@jd:body
8
9
10<div id="tb-wrapper">
11  <div id="tb">
12
13    <h2>Содержание этого урока</h2>
14<ol>
15  <li><a href="#lifecycle-states">Изучение обратных вызовов жизненного цикла</a></li>
16  <li><a href="#launching-activity">Указание операции, запускающей приложение</a></li>
17  <li><a href="#Create">Создание нового экземпляра</a></li>
18  <li><a href="#Destroy">Уничтожение операции</a></li>
19</ol>
20
21    <h2>См. также:</h2>
22    <ul>
23      <li><a href="{@docRoot}guide/components/activities.html">Операции</a></li>
24    </ul>
25
26<h2>Попробуйте сами</h2>
27
28<div class="download-box">
29 <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">Загрузить демонстрацию</a>
30 <p class="filename">ActivityLifecycle.zip</p>
31</div>
32
33  </div>
34</div>
35
36<p>В отличие от других парадигм программирования, где приложения запускаются с использованием метода {@code main()}, система
37Android запускает код в {@link android.app.Activity}экземпляре посредством активации определенных
38методов обратного вызова, соответствующих определенным этапам его
39жизненного цикла. Существует последовательность методов обратного вызова, которые запускают операцию и последовательность
40методов обратного вызова, уничтожающих операцию.</p>
41
42<p>В этом уроке рассматриваются наиболее важные методы жизненного цикла и демонстрируется, как
43обработать первый обратный вызов жизненного цикла, создающий новый экземпляр операции.</p>
44
45
46
47<h2 id="lifecycle-states">Изучение обратных вызовов жизненного цикла</h2>
48
49<p>В течение цикла существования операции система вызывает базовый набор методов жизненного цикла в
50последовательности, сходной с многоступенчатой пирамидой. Таким образом, каждый этап
51жизненного цикла операции представляет собой отдельную ступень пирамиды. Когда система создает новый экземпляр операции,
52каждый метод обратного вызова перемещает состояние действия на одну ступень вверх. Вершина пирамиды представляет собой
53точку, в которой операция выполняется в экранном режиме, и пользователь может с ней взаимодействовать.</p>
54
55<p>Когда пользователь начинает выходить из операции, система вызывает другие методы, которые перемещают состояние
56операции вниз по пирамиде для уничтожения действия. В некоторых случаях действие
57перемещает операцию вниз по пирамиде только частично и ждет (например когда пользователь переключается на другое приложение),
58а затем операция может быть перемещена обратно вверх (если пользователь вернется к операции) и
59возобновлена там, где пользователь вышел из нее.</p>
60
61
62<img src="{@docRoot}images/training/basics/basic-lifecycle.png" />
63<p class="img-caption"><strong>Рисунок 1</strong>. Упрощенная иллюстрация жизненного цикла операции
64в виде многоступенчатой пирамиды. На рисунке показано, что для каждого обратного вызова,
65поднимающего операцию на одну ступень к состоянию возобновления на вершине пирамиды,
66существует обратный вызов, опускающий операцию на одну ступень вниз. Возобновление операции также может производиться из состояний
67паузы и остановки.</p>
68
69
70<p>В зависимости от сложности операции, некоторые
71методы жизненного цикла могут не требоваться. Однако очень важно понимать все методы и реализовать их так, чтобы
72приложение работало так, как этого ожидают пользователи. Правильная реализация методов жизненного цикла операции
73обеспечивает нормальную работу приложения в нескольких аспектах, в том числе:</p>
74<ul>
75  <li>Не прекращает работу, если пользователь получает телефонный звонок или переключается на другое приложение
76во время использования вашего приложения.</li>
77  <li>Не потребляет ценные системные ресурсы, когда пользователь не использует
78его активно.</li>
79  <li>Сохраняет состояние приложения, если пользователь выходит из него и возвращается
80позднее.</li>
81  <li>Не закрывается с ошибкой и не теряет данные пользователя при повороте экрана (смене ориентации между книжной
82и альбомной.</li>
83</ul>
84
85<!--
86<p class="table-caption"><strong>Table 1.</strong> Activity lifecycle state pairs and callback
87methods.</p>
88<table>
89  <tr>
90    <th scope="col">Lifecycle State</th>
91    <th scope="col">Startup Method</th>
92    <th scope="col">Teardown Method</th>
93  </tr>
94  <tr>
95    <td>Created / Destroyed</td>
96    <td>{@link android.app.Activity#onCreate onCreate()}</td>
97    <td>{@link android.app.Activity#onDestroy()}</td>
98  </tr>
99  <tr>
100    <td>Started / Stopped</td>
101    <td>{@link android.app.Activity#onStart()}</td>
102    <td>{@link android.app.Activity#onStop()}</td>
103  </tr>
104  <tr>
105    <td>Resumed / Resumed</td>
106    <td>{@link android.app.Activity#onResume()}</td>
107    <td>{@link android.app.Activity#onPause()}</td>
108  </tr>
109</table>
110-->
111
112<p>Как вы узнаете на следующих уроках, в некоторых ситуациях операция
113переключается между разными состояниями, как показано на рисунке 1. Однако только три
114из этих состояний могут быть статичными. Это означает, что операция может существовать относительно длительное
115время только в одном из этих трех состояний.</p>
116<dl>
117  <dt>Возобновление</dt>
118    <dd>В этом состоянии операция выполняется в экранном режиме, и пользователь может с ней взаимодействовать.
119Иногда это состояние также называется рабочим состоянием.</dd>
120  <dt>Приостановка</dt>
121    <dd>В этом состоянии операция частично закрывается другой операцией &mdash; в экранном режиме
122эта другая операция или является полупрозрачной, или не закрывает экран целиком. Приостановленная операция
123не получает команд пользователя и не может выполнять код.
124  <dt>Остановка</dt>
125    <dd>В этом состоянии операция полностью скрыта и невидима для пользователя. Она считается находящейся в
126фоновом режиме. В состоянии остановки сохраняется экземпляр операции и вся его информация
127о состоянии, например, переменных, однако операция не может выполнять код.</dd>
128</dl>
129
130<p>Другие состояния (создание и запуск) являются переходными, и система быстро переходит от них
131к следующим состояниям посредством вызова следующего метода обратного вызова в жизненном цикле. Таким образом, после вызова
132{@link android.app.Activity#onCreate onCreate()} система быстро вызывает {@link
133android.app.Activity#onStart()}, а затем сразу же вызывает {@link
134android.app.Activity#onResume()}.</p>
135
136<p>Так выглядит базовый жизненный цикл операции. Теперь рассмотрим определенные виды
137поведения в жизненном цикле.</p>
138
139
140
141<h2 id="launching-activity">Указание операции, запускающей приложение</h2>
142
143<p>Когда пользователь выбирает значок приложения на главном экране, система вызывает метод {@link
144android.app.Activity#onCreate onCreate()} для {@link android.app.Activity} в вашем приложении
145в соответствии с тем, какую операцию вы задекларировали как операцию запуска (или основную операцию). Эта операция выступает
146основной точкой входа в пользовательский интерфейс вашего приложения.</p>
147
148<p>Для определения основной операции вы можете использовать файл манифеста Android <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">{@code AndroidManifest.xml}</a>,
149который находится в корневом каталоге вашего проекта.</p>
150
151<p>Основная операция приложения должна декларироваться в манифесте с помощью фильтра <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
152<intent-filter>}</a>, включающего действие {@link
153android.content.Intent#ACTION_MAIN MAIN} и категорию
154{@link android.content.Intent#CATEGORY_LAUNCHER LAUNCHER}. Например:</p>
155
156<pre>
157&lt;activity android:name=".MainActivity" android:label="&#64;string/app_name">
158    &lt;intent-filter>
159        &lt;action android:name="android.intent.action.MAIN" />
160        &lt;category android:name="android.intent.category.LAUNCHER" />
161    &lt;/intent-filter>
162&lt;/activity>
163</pre>
164
165<p class="note"><strong>Примечание.</strong> При создании нового проекта Android с помощью инструментов
166Android SDK файлы проекта по умолчанию включают класс {@link android.app.Activity}, который декларируется в
167манифесте с помощью этого фильтра.</p>
168
169<p>Если для одной из операций не декларировано действие {@link android.content.Intent#ACTION_MAIN MAIN} или категория
170{@link android.content.Intent#CATEGORY_LAUNCHER LAUNCHER}, значок
171приложения не будет отображатья в списке приложений на главном экране.</p>
172
173
174
175<h2 id="Create">Создание нового экземпляра</h2>
176
177<p>Большинство приложений содержат различные операции, позволяющие пользователю выполнять различные действия.
178Как для основных операций, создаваемых при нажатии на значок приложения, так
179и для других операций, которыми приложение реагирует на действия пользователя, система создает
180каждый новый экземпляр {@link android.app.Activity} посредством вызова его метода {@link
181android.app.Activity#onCreate onCreate()}.</p>
182
183<p>Вы должны реализовать метод {@link android.app.Activity#onCreate onCreate()} для выполнения базовой
184логики запуска приложения, которое должно производиться только один раз для всего срока существования операции. Например,
185ваша реализация {@link android.app.Activity#onCreate onCreate()} должна содержать определение пользовательского
186интерфейса и возможно создавать экземпляры некоторых переменных уровня класса.</p>
187
188<p>Например, в следующем примере метода {@link android.app.Activity#onCreate onCreate()}
189показан код, выполняющий фундаментальную настройку операции, включая
190декларирование пользовательского интерфейса (определен в файле макета XML), определение составных переменных
191и частичную настройку пользовательского интерфейса.</p>
192
193<pre>
194TextView mTextView; // Member variable for text view in the layout
195
196&#64;Override
197public void onCreate(Bundle savedInstanceState) {
198    super.onCreate(savedInstanceState);
199
200    // Set the user interface layout for this Activity
201    // The layout file is defined in the project res/layout/main_activity.xml file
202    setContentView(R.layout.main_activity);
203
204    // Initialize member TextView so we can manipulate it later
205    mTextView = (TextView) findViewById(R.id.text_message);
206
207    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
208    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
209        // For the main activity, make sure the app icon in the action bar
210        // does not behave as a button
211        ActionBar actionBar = getActionBar();
212        actionBar.setHomeButtonEnabled(false);
213    }
214}
215</pre>
216
217<p class="caution"><strong>Внимание!</strong> Использование {@link android.os.Build.VERSION#SDK_INT} для
218предотвращения запуска новых API-интерфейсов на старых системах поддерживается только в Android версии 2.0 (API-интерфейсы уровня
2195) и более поздних версиях. В старых версиях возникнет ошибка времени исполнения.</p>
220
221<p>После завершения выполнения {@link android.app.Activity#onCreate onCreate()} система
222быстро вызывает методы {@link android.app.Activity#onStart()} и {@link android.app.Activity#onResume()} по
223очереди. Операция никогда не остается в состоянии создания или запуска. Технически
224операция становится видимой для пользователя при вызове {@link android.app.Activity#onStart()}, однако затем сразу же происходит
225{@link android.app.Activity#onResume()} и операция остается в состоянии возобновления,
226пока что-то не произойдет, например пока не поступит телефонный звонок, пользователь не переключится
227на другую операцию или экран устройства не выключится.</p>
228
229<p>На последующих уроках вы увидите, как можно с пользой использовать другие методы запуска, {@link
230android.app.Activity#onStart()} и {@link android.app.Activity#onResume()}, в жизненном цикле операции
231при возобновлении работы после паузы или остановки.</p>
232
233<p class="note"><strong>Примечание.</strong> Метод {@link android.app.Activity#onCreate onCreate()}
234включает параметр <code>savedInstanceState</code>, о котором будет рассказано на
235уроке <a href="recreating.html">Воссоздание операции</a>.</p>
236
237
238<img src="{@docRoot}images/training/basics/basic-lifecycle-create.png" />
239<p class="img-caption"><strong>Рисунок 2.</strong> Еще один пример структуры жизненного
240цикла операции, где основное внимание трем главным обратным вызовам, которые система выполняет по очереди при создании
241нового экземпляра операции: {@link android.app.Activity#onCreate onCreate()}, {@link
242android.app.Activity#onStart()} и {@link android.app.Activity#onResume()}. После завершения этой серии
243обратных вызовов операция переходит в состояние возобновления, где пользователи могут
244взаимодействовать с операцией до тех пор, пока не переключатся на другую операцию.</p>
245
246
247
248
249
250
251
252<h2 id="Destroy">Уничтожение операции</h2>
253
254<p>Первым обратным вызовом жизненного цикла операции является {@link android.app.Activity#onCreate
255onCreate()}, а последним – {@link android.app.Activity#onDestroy}. Система вызывает
256этот метод для операции, подавая окончательный сигнал
257о том, что экземпляр операции полностью удаляется из системной памяти.</p>
258
259<p>Большинству приложений не требуется реализация этого метода, потому что ссылки локальных классов уничтожаются
260вместе с операцией, а основные задачи по освобождению ресурсов операция выполняет в состояниях {@link
261android.app.Activity#onPause} и {@link android.app.Activity#onStop}. Однако если ваша
262операция содержит фоновые потоки, созданные во время выполнения {@link
263android.app.Activity#onCreate onCreate()}, или в течение длительного времени использует другие ресурсы, могущие
264вызывать утечку памяти при неправильном закрытии, их нужно уничтожить с помощью метода {@link
265android.app.Activity#onDestroy}.</p>
266
267<pre>
268&#64;Override
269public void onDestroy() {
270    super.onDestroy();  // Always call the superclass
271
272    // Stop method tracing that the activity started during onCreate()
273    android.os.Debug.stopMethodTracing();
274}
275</pre>
276
277<p class="note"><strong>Примечание.</strong> Система вызывает {@link android.app.Activity#onDestroy}
278после вызова {@link android.app.Activity#onPause} и {@link
279android.app.Activity#onStop} во всех случаях, кроме ситуации, когда вы вызываете {@link
280android.app.Activity#finish()} из метода {@link android.app.Activity#onCreate onCreate()}
281. В некоторых случаях, например когда ваша операция временно отвечает за принятие решения о запуске
282другой операции, вы можете вызвать {@link android.app.Activity#finish()} из метода {@link
283android.app.Activity#onCreate onCreate()} для уничтожения операции. В этом случае система
284сразу же вызывает {@link android.app.Activity#onDestroy}, не вызывая другие методы жизненного
285цикла.</p>
286