page.title=Приостановка и возобновление операции page.tags=жизненный цикл операции helpoutsWidget=true trainingnavtop=true @jd:body
При обычном использовании приложения выполняемая на экране операция иногда закрывается другими визуальными компонентами, в результате чего операция приостанавливается. Например, при открытии полупрозрачной операции (например диалогового окна) предыдущая операция приостанавливается. Пока операция остается частично видимой, но не остается в фокусе, она остается на паузе.
Однако когда операция полностью закрывается и становится невидимой, она останавливается (об этом будет рассказано на следующем уроке).
Когда операция приостанавливается, система вызывает метод {@link android.app.Activity#onPause onPause()} на {@link android.app.Activity}, что позволяет остановить текущие действия, которые не должны продолжаться во время паузы (например воспроизведение видео), или сохранять любую информацию, которая должна постоянно сохраняться в случае выхода пользователя из приложения. Если пользователь возвращается к операции после паузы, система возобновляет ее и вызывает метод {@link android.app.Activity#onResume onResume()}.
Примечание. Когда операция получает вызов {@link android.app.Activity#onPause()}, это может указывать, что операция будет приостановлена совсем ненадолго и пользователь сможет к ней вернуться. Однако обычно это является первым признаком выхода пользователя из операции.
Рисунок 1. Когда полупрозрачная операция закрывает вашу операцию, система вызывает {@link android.app.Activity#onPause onPause()} и операция переходит в состояние паузы (1). Если пользователь возвращается к операции, находящейся в состоянии паузы, система вызывает {@link android.app.Activity#onResume onResume()} (2).
Когда система вызывает {@link android.app.Activity#onPause()} для операции, это технически означает, что операция остается частично видимой. Однако чаще всего это означает, что пользователь покидает операцию, и вскоре она войдет в состояние остановки. Обратный вызов {@link android.app.Activity#onPause()} обычно следует использовать для следующих целей:
Например, если ваше приложение использует {@link android.hardware.Camera}, метод {@link android.app.Activity#onPause()} подойдет для его освобождения.
@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; } }
Обычно не следует использовать {@link android.app.Activity#onPause()} для сохранения пользовательских изменений (например введенной в форму личной информации) в постоянном хранилище. Изменения пользователя нужно сохранять в постоянном хранилище {@link android.app.Activity#onPause()} только в тех случаях, когда пользователи ожидают автоматического сохранения изменений (например при составлении черновика электронного письма). Однако в состоянии {@link android.app.Activity#onPause()} следует избегать операций с высокой нагрузкой на процессор, например выполнения записи в базу данных, поскольку это может замедлить видимый переход к следующей операции (вместо этого следует выполнять операции завершения работы с высокой нагрузкой при {@link android.app.Activity#onStop onStop()}).
Количество операций, выполняемых с помощью метода {@link android.app.Activity#onPause onPause()}, должно быть не очень большим, чтобы пользователь мог быстро переключаться на следующую задачу при фактической остановке вашей операции.
Примечание. При приостановке операции экземпляр {@link android.app.Activity} остается в памяти и заново вызывается при возобновлении операции. Не нужно заново инициализировать компоненты, созданные с использованием любого из методов обратного вызова для возобновления операции.
Когда пользователь возобновляет операцию после паузы, система вызывает метод {@link android.app.Activity#onResume()}.
Учтите, что система вызывает этот метод каждый раз, когда ваша операция выполняется на экране, в том числе и при первом ее запуске. В связи с этим, нужно реализовать метод {@link android.app.Activity#onResume()} для инициализации компонентов, освобождаемых в состоянии {@link android.app.Activity#onPause()}, и выполнения других операций инициализации, которые должны происходить каждый раз при возобновлении операции (например при запуске анимированных элементов и компонентов, которые используются только когда пользователь следит за операцией на экране).
Следующий пример {@link android.app.Activity#onResume()} дополняет пример {@link android.app.Activity#onPause()} выше. В нем инициализируется камера, которая освобождается на время приостановки операции.
@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 } }