summaryrefslogtreecommitdiffstats
path: root/docs/html-intl/intl/ru/training/basics/activity-lifecycle/starting.jd
blob: 3a946e2c5e007afe41781ec8d139dcad775adcfa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
page.title=Запуск операции
page.tags=жизненный цикл операции
helpoutsWidget=true

trainingnavtop=true

@jd:body


<div id="tb-wrapper">
  <div id="tb">
    
    <h2>Содержание этого урока</h2>
<ol>
  <li><a href="#lifecycle-states">Изучение обратных вызовов жизненного цикла</a></li>
  <li><a href="#launching-activity">Указание операции, запускающей приложение</a></li>
  <li><a href="#Create">Создание нового экземпляра</a></li>
  <li><a href="#Destroy">Уничтожение операции</a></li>
</ol>
    
    <h2>См. также:</h2>
    <ul>
      <li><a href="{@docRoot}guide/components/activities.html">Операции</a></li>
    </ul>

<h2>Попробуйте сами</h2>

<div class="download-box">
 <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">Загрузить демонстрацию</a>
 <p class="filename">ActivityLifecycle.zip</p>
</div>

  </div>
</div>

<p>В отличие от других парадигм программирования, где приложения запускаются с использованием метода {@code main()}, система
Android запускает код в {@link android.app.Activity}экземпляре посредством активации определенных 
методов обратного вызова, соответствующих определенным этапам его
жизненного цикла. Существует последовательность методов обратного вызова, которые запускают операцию и последовательность
методов обратного вызова, уничтожающих операцию.</p>

<p>В этом уроке рассматриваются наиболее важные методы жизненного цикла и демонстрируется, как
обработать первый обратный вызов жизненного цикла, создающий новый экземпляр операции.</p>



<h2 id="lifecycle-states">Изучение обратных вызовов жизненного цикла</h2>

<p>В течение цикла существования операции система вызывает базовый набор методов жизненного цикла в
последовательности, сходной с многоступенчатой пирамидой. Таким образом, каждый этап
жизненного цикла операции представляет собой отдельную ступень пирамиды. Когда система создает новый экземпляр операции,
каждый метод обратного вызова перемещает состояние действия на одну ступень вверх. Вершина пирамиды представляет собой
точку, в которой операция выполняется в экранном режиме, и пользователь может с ней взаимодействовать.</p>

<p>Когда пользователь начинает выходить из операции, система вызывает другие методы, которые перемещают состояние
операции вниз по пирамиде для уничтожения действия. В некоторых случаях действие
перемещает операцию вниз по пирамиде только частично и ждет (например когда пользователь переключается на другое приложение),
а затем операция может быть перемещена обратно вверх (если пользователь вернется к операции) и
возобновлена там, где пользователь вышел из нее.</p>


<img src="{@docRoot}images/training/basics/basic-lifecycle.png" />
<p class="img-caption"><strong>Рисунок 1</strong>. Упрощенная иллюстрация жизненного цикла операции
в виде многоступенчатой пирамиды. На рисунке показано, что для каждого обратного вызова,
поднимающего операцию на одну ступень к состоянию возобновления на вершине пирамиды,
существует обратный вызов, опускающий операцию на одну ступень вниз. Возобновление операции также может производиться из состояний
паузы и остановки.</p>


<p>В зависимости от сложности операции, некоторые
методы жизненного цикла могут не требоваться. Однако очень важно понимать все методы и реализовать их так, чтобы
приложение работало так, как этого ожидают пользователи. Правильная реализация методов жизненного цикла операции
обеспечивает нормальную работу приложения в нескольких аспектах, в том числе:</p>
<ul>
  <li>Не прекращает работу, если пользователь получает телефонный звонок или переключается на другое приложение
во время использования вашего приложения.</li>
  <li>Не потребляет ценные системные ресурсы, когда пользователь не использует
его активно.</li>
  <li>Сохраняет состояние приложения, если пользователь выходит из него и возвращается
позднее.</li>
  <li>Не закрывается с ошибкой и не теряет данные пользователя при повороте экрана (смене ориентации между книжной
и альбомной.</li>
</ul>

<!--
<p class="table-caption"><strong>Table 1.</strong> Activity lifecycle state pairs and callback 
methods.</p>
<table>
  <tr>
    <th scope="col">Lifecycle State</th>
    <th scope="col">Startup Method</th>
    <th scope="col">Teardown Method</th>
  </tr>
  <tr>
    <td>Created / Destroyed</td>
    <td>{@link android.app.Activity#onCreate onCreate()}</td>
    <td>{@link android.app.Activity#onDestroy()}</td>
  </tr>
  <tr>
    <td>Started / Stopped</td>
    <td>{@link android.app.Activity#onStart()}</td>
    <td>{@link android.app.Activity#onStop()}</td>
  </tr>
  <tr>
    <td>Resumed / Resumed</td>
    <td>{@link android.app.Activity#onResume()}</td>
    <td>{@link android.app.Activity#onPause()}</td>
  </tr>
</table>
-->

<p>Как вы узнаете на следующих уроках, в некоторых ситуациях операция
переключается между разными состояниями, как показано на рисунке 1. Однако только три
из этих состояний могут быть статичными. Это означает, что операция может существовать относительно длительное
время только в одном из этих трех состояний.</p>
<dl>
  <dt>Возобновление</dt>
    <dd>В этом состоянии операция выполняется в экранном режиме, и пользователь может с ней взаимодействовать.
Иногда это состояние также называется рабочим состоянием.</dd>
  <dt>Приостановка</dt>
    <dd>В этом состоянии операция частично закрывается другой операцией &mdash; в экранном режиме
эта другая операция или является полупрозрачной, или не закрывает экран целиком. Приостановленная операция
не получает команд пользователя и не может выполнять код.
  <dt>Остановка</dt>
    <dd>В этом состоянии операция полностью скрыта и невидима для пользователя. Она считается находящейся в
фоновом режиме. В состоянии остановки сохраняется экземпляр операции и вся его информация
о состоянии, например, переменных, однако операция не может выполнять код.</dd>
</dl>

<p>Другие состояния (создание и запуск) являются переходными, и система быстро переходит от них
к следующим состояниям посредством вызова следующего метода обратного вызова в жизненном цикле. Таким образом, после вызова
{@link android.app.Activity#onCreate onCreate()} система быстро вызывает {@link
android.app.Activity#onStart()}, а затем сразу же вызывает {@link
android.app.Activity#onResume()}.</p>

<p>Так выглядит базовый жизненный цикл операции. Теперь рассмотрим определенные виды
поведения в жизненном цикле.</p>



<h2 id="launching-activity">Указание операции, запускающей приложение</h2> 

<p>Когда пользователь выбирает значок приложения на главном экране, система вызывает метод {@link
android.app.Activity#onCreate onCreate()} для {@link android.app.Activity} в вашем приложении
в соответствии с тем, какую операцию вы задекларировали как операцию запуска (или основную операцию). Эта операция выступает
основной точкой входа в пользовательский интерфейс вашего приложения.</p>

<p>Для определения основной операции вы можете использовать файл манифеста Android <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">{@code AndroidManifest.xml}</a>,
который находится в корневом каталоге вашего проекта.</p>

<p>Основная операция приложения должна декларироваться в манифесте с помощью фильтра <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
&lt;intent-filter&gt;}</a>, включающего действие {@link
android.content.Intent#ACTION_MAIN MAIN} и категорию
{@link android.content.Intent#CATEGORY_LAUNCHER LAUNCHER}. Например:</p> 

<pre>
&lt;activity android:name=".MainActivity" android:label="&#64;string/app_name">
    &lt;intent-filter>
        &lt;action android:name="android.intent.action.MAIN" />
        &lt;category android:name="android.intent.category.LAUNCHER" />
    &lt;/intent-filter>
&lt;/activity>
</pre>

<p class="note"><strong>Примечание.</strong> При создании нового проекта Android с помощью инструментов
Android SDK файлы проекта по умолчанию включают класс {@link android.app.Activity}, который декларируется в
манифесте с помощью этого фильтра.</p>

<p>Если для одной из операций не декларировано действие {@link android.content.Intent#ACTION_MAIN MAIN} или категория
{@link android.content.Intent#CATEGORY_LAUNCHER LAUNCHER}, значок
приложения не будет отображатья в списке приложений на главном экране.</p>



<h2 id="Create">Создание нового экземпляра</h2>

<p>Большинство приложений содержат различные операции, позволяющие пользователю выполнять различные действия.
Как для основных операций, создаваемых при нажатии на значок приложения, так
и для других операций, которыми приложение реагирует на действия пользователя, система создает
каждый новый экземпляр {@link android.app.Activity} посредством вызова его метода {@link
android.app.Activity#onCreate onCreate()}.</p>

<p>Вы должны реализовать метод {@link android.app.Activity#onCreate onCreate()} для выполнения базовой
логики запуска приложения, которое должно производиться только один раз для всего срока существования операции. Например,
ваша реализация {@link android.app.Activity#onCreate onCreate()} должна содержать определение пользовательского
интерфейса и возможно создавать экземпляры некоторых переменных уровня класса.</p>

<p>Например, в следующем примере метода {@link android.app.Activity#onCreate onCreate()}
показан код, выполняющий фундаментальную настройку операции, включая
декларирование пользовательского интерфейса (определен в файле макета XML), определение составных переменных
и частичную настройку пользовательского интерфейса.</p>

<pre>
TextView mTextView; // Member variable for text view in the layout

&#64;Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);
    
    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);
    
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}
</pre>

<p class="caution"><strong>Внимание!</strong> Использование {@link android.os.Build.VERSION#SDK_INT} для
предотвращения запуска новых API-интерфейсов на старых системах поддерживается только в Android версии 2.0 (API-интерфейсы уровня
5) и более поздних версиях. В старых версиях возникнет ошибка времени исполнения.</p>

<p>После завершения выполнения {@link android.app.Activity#onCreate onCreate()} система
быстро вызывает методы {@link android.app.Activity#onStart()} и {@link android.app.Activity#onResume()} по
очереди. Операция никогда не остается в состоянии создания или запуска. Технически
операция становится видимой для пользователя при вызове {@link android.app.Activity#onStart()}, однако затем сразу же происходит 
{@link android.app.Activity#onResume()} и операция остается в состоянии возобновления,
пока что-то не произойдет, например пока не поступит телефонный звонок, пользователь не переключится
на другую операцию или экран устройства не выключится.</p>

<p>На последующих уроках вы увидите, как можно с пользой использовать другие методы запуска, {@link
android.app.Activity#onStart()} и {@link android.app.Activity#onResume()}, в жизненном цикле операции
при возобновлении работы после паузы или остановки.</p>

<p class="note"><strong>Примечание.</strong> Метод {@link android.app.Activity#onCreate onCreate()}
включает параметр <code>savedInstanceState</code>, о котором будет рассказано на
уроке <a href="recreating.html">Воссоздание операции</a>.</p>


<img src="{@docRoot}images/training/basics/basic-lifecycle-create.png" />
<p class="img-caption"><strong>Рисунок 2.</strong> Еще один пример структуры жизненного
цикла операции, где основное внимание трем главным обратным вызовам, которые система выполняет по очереди при создании
нового экземпляра операции: {@link android.app.Activity#onCreate onCreate()}, {@link
android.app.Activity#onStart()} и {@link android.app.Activity#onResume()}. После завершения этой серии
обратных вызовов операция переходит в состояние возобновления, где пользователи могут
взаимодействовать с операцией до тех пор, пока не переключатся на другую операцию.</p>







<h2 id="Destroy">Уничтожение операции</h2>

<p>Первым обратным вызовом жизненного цикла операции является {@link android.app.Activity#onCreate
onCreate()}, а последним – {@link android.app.Activity#onDestroy}. Система вызывает
этот метод для операции, подавая окончательный сигнал
о том, что экземпляр операции полностью удаляется из системной памяти.</p>

<p>Большинству приложений не требуется реализация этого метода, потому что ссылки локальных классов уничтожаются
вместе с операцией, а основные задачи по освобождению ресурсов операция выполняет в состояниях {@link
android.app.Activity#onPause} и {@link android.app.Activity#onStop}. Однако если ваша
операция содержит фоновые потоки, созданные во время выполнения {@link
android.app.Activity#onCreate onCreate()}, или в течение длительного времени использует другие ресурсы, могущие
вызывать утечку памяти при неправильном закрытии, их нужно уничтожить с помощью метода {@link
android.app.Activity#onDestroy}.</p>

<pre>
&#64;Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass
    
    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}
</pre>

<p class="note"><strong>Примечание.</strong> Система вызывает {@link android.app.Activity#onDestroy}
после вызова {@link android.app.Activity#onPause} и {@link
android.app.Activity#onStop} во всех случаях, кроме ситуации, когда вы вызываете {@link
android.app.Activity#finish()} из метода {@link android.app.Activity#onCreate onCreate()}
. В некоторых случаях, например когда ваша операция временно отвечает за принятие решения о запуске
другой операции, вы можете вызвать {@link android.app.Activity#finish()} из метода {@link
android.app.Activity#onCreate onCreate()} для уничтожения операции. В этом случае система
сразу же вызывает {@link android.app.Activity#onDestroy}, не вызывая другие методы жизненного
цикла.</p>