blob: c4837809acf227b549d5c43283c10d9c0f2d063c [file] [log] [blame]
page.title=Приостановка и возобновление операции
page.tags=жизненный цикл операции
helpoutsWidget=true
trainingnavtop=true
@jd:body
<div id="tb-wrapper">
<div id="tb">
<h2>Содержание этого урока</h2>
<ol>
<li><a href="#Pause">Приостановка операции</a></li>
<li><a href="#Resume">Возобновление операции</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>При обычном использовании приложения выполняемая на экране операция иногда закрывается другими
визуальными компонентами, в результате чего операция <em>приостанавливается</em>. Например, при открытии полупрозрачной
операции (например диалогового окна) предыдущая операция приостанавливается. Пока
операция остается частично видимой, но не остается в фокусе, она остается на паузе.</p>
<p>Однако когда операция полностью закрывается и становится невидимой, она <em>останавливается</em> (об этом будет рассказано
на следующем уроке).</p>
<p>Когда операция приостанавливается, система вызывает метод {@link
android.app.Activity#onPause onPause()} на {@link android.app.Activity}, что позволяет
остановить текущие действия, которые не должны продолжаться во время паузы (например воспроизведение видео), или сохранять
любую информацию, которая должна постоянно сохраняться в случае выхода пользователя из приложения. Если
пользователь возвращается к операции после паузы, система возобновляет ее и вызывает метод
{@link android.app.Activity#onResume onResume()}.</p>
<p class="note"><strong>Примечание.</strong> Когда операция получает вызов {@link
android.app.Activity#onPause()}, это может указывать, что операция будет приостановлена совсем ненадолго
и пользователь сможет к ней вернуться. Однако обычно это является первым признаком
выхода пользователя из операции.</p>
<img src="{@docRoot}images/training/basics/basic-lifecycle-paused.png" />
<p class="img-caption"><strong>Рисунок 1</strong>. Когда полупрозрачная операция закрывает
вашу операцию, система вызывает {@link android.app.Activity#onPause onPause()} и операция
переходит в состояние паузы (1). Если пользователь возвращается к операции, находящейся в состоянии паузы,
система вызывает {@link android.app.Activity#onResume onResume()} (2).</p>
<h2 id="Pause">Приостановка операции</h2>
<p>Когда система вызывает {@link android.app.Activity#onPause()} для операции, это
технически означает, что операция остается частично видимой. Однако чаще всего это означает, что
пользователь покидает операцию, и вскоре она войдет в состояние остановки. Обратный вызов
{@link android.app.Activity#onPause()} обычно следует использовать для следующих целей:</p>
<ul>
<li>Остановка анимации или других текущих действий, которые могут потреблять ресурсы процессора.</li>
<li>Запись несохраненных изменений, если пользователи ожидают сохранения таких изменений
при выходе (например черновиков электронных писем).</li>
<li>Высвобождение ресурсов системы, например ресиверов, интерфейсов сенсоров (например
GPS) или других ресурсов, влияющих на время работы аккумулятора во время паузы и не
требующихся пользователю.</li>
</ul>
<p>Например, если ваше приложение использует {@link android.hardware.Camera}, метод
{@link android.app.Activity#onPause()} подойдет для его освобождения.</p>
<pre>
&#64;Override
public void onPause() {
super.onPause(); // Always call the superclass method first
// Release the Camera because we don't need it when paused
// and other activities might need to use it.
if (mCamera != null) {
mCamera.release()
mCamera = null;
}
}
</pre>
<p>Обычно <strong>не</strong> следует использовать {@link android.app.Activity#onPause()} для сохранения
пользовательских изменений (например введенной в форму личной информации) в постоянном хранилище. Изменения
пользователя нужно сохранять в постоянном хранилище {@link android.app.Activity#onPause()}
только в тех случаях, когда пользователи ожидают автоматического сохранения изменений (например при составлении черновика электронного письма).
Однако в состоянии {@link
android.app.Activity#onPause()} следует избегать операций с высокой нагрузкой на процессор, например выполнения записи в базу данных, поскольку это может замедлить видимый
переход к следующей операции (вместо этого следует выполнять операции завершения работы с высокой нагрузкой при
{@link android.app.Activity#onStop onStop()}).</p>
<p>Количество операций, выполняемых с помощью метода {@link android.app.Activity#onPause
onPause()}, должно быть не очень большим, чтобы пользователь мог быстро переключаться на следующую
задачу при фактической остановке вашей операции.</p>
<p class="note"><strong>Примечание.</strong> При приостановке операции экземпляр {@link
android.app.Activity} остается в памяти и заново вызывается при возобновлении операции.
Не нужно заново инициализировать компоненты, созданные с использованием любого из методов обратного вызова для возобновления
операции.</p>
<h2 id="Resume">Возобновление операции</h2>
<p>Когда пользователь возобновляет операцию после паузы, система вызывает метод {@link
android.app.Activity#onResume()}.</p>
<p>Учтите, что система вызывает этот метод каждый раз, когда ваша операция выполняется на экране,
в том числе и при первом ее запуске. В связи с этим, нужно реализовать метод {@link
android.app.Activity#onResume()} для инициализации компонентов, освобождаемых в состоянии {@link
android.app.Activity#onPause()}, и выполнения других операций инициализации, которые должны происходить каждый раз при возобновлении операции
(например при запуске анимированных элементов и компонентов, которые используются
только когда пользователь следит за операцией на экране).</p>
<p>Следующий пример {@link android.app.Activity#onResume()} дополняет
пример {@link android.app.Activity#onPause()} выше. В нем инициализируется камера,
которая освобождается на время приостановки операции.</p>
<pre>
&#64;Override
public void onResume() {
super.onResume(); // Always call the superclass method first
// Get the Camera instance as the activity achieves full user focus
if (mCamera == null) {
initializeCamera(); // Local method to handle camera init
}
}
</pre>