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>В этом состоянии операция частично закрывается другой операцией — в экранном режиме 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<activity android:name=".MainActivity" android:label="@string/app_name"> 158 <intent-filter> 159 <action android:name="android.intent.action.MAIN" /> 160 <category android:name="android.intent.category.LAUNCHER" /> 161 </intent-filter> 162</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@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@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