Приостановка и возобновление деятельности

Этот урок научит вас

  1. Приостановка вашей деятельности
  2. Возобновление вашей деятельности

Вы также должны прочитать

Попробуйте

Скачать демо-версию

ActivityLifecycle.zip

При нормальном использовании приложение, деятельность на переднем плане иногда перекрывается другими визуальными компонентами, которые приводят к приостановке. Например, когда полупрозрачная деятельность открывается (например, в одном из стилей диалога), предыдущая деятельность приостанавливается. Пока деятельность все еще частично видна, но в настоящее время находится не в фокусе, она остается приостановленной.

Однако, как только деятельность станет полностью не видна, она останавливается (это будет обсуждаться в следующем уроке).

Как только ваша деятельность переходит в приостановленное состояние, система вызывает onPause() метод для вашей Activity, который позволяет остановить продолжающиеся действия, которые не должны продолжаться во время приостановки (такие как видео), или сохранить любую информацию в постоянном хранилище, в случае, если пользователь уйдет из вашего приложения. Если пользователь возвращается к вашей деятельности, находящейся в состояния приостановки, система возобновит её и вызовет onResume() метод.

Примечание: Когда ваша деятельность получает вызов onPause(), это может быть признаком того, что деятельность будет приостановлена ​​на мгновение, и пользователь может вернуть фокус вашей деятельности. Однако, обычно это первый признак того, что пользователь покидает вашу деятельность.

Рисунок 1. Когда полупрозрачная деятельность скрывает вашу деятельность, система вызывает onPause() и деятельность ждет в состоянии Paused (1). Если пользователь возвращается к деятельности, пока она все еще приостановлена, система вызывает onResume() (2).

Приостановка вашей деятельности

Когда система вызывает onPause() метод вашей деятельности, технически это означает, что ваша деятельность по-прежнему частично видна, но чаще всего это признак того, что пользователь покидает деятельность, и в скором времени она перейдет в остановленное состояние. Обычно вы должны использовать onPause() метод обратного вызова, чтобы:

  • Остановить анимацию или другие текущие действия, которые могут использовать процессор.
  • Сохранить несохраненные изменения, но только если пользователи ожидают, чтобы эти изменения были в постоянном хранилище, когда они покидают вашу деятельность (например, черновик письма электронной почты).
  • Освободить системные ресурсы, такие как широковещательные приемники, дескрипторы датчиков (как GPS), или любые ресурсы, которые могут повлиять на время работы батареи, пока ваша деятельность приостановлена, и пользователю они не нужны.

Например, если приложение использует Camera, 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;
    }
}

Как правило, вы не должны использовать onPause() для сохранения пользовательских изменений (например, персональной информации введенной в форме) в постоянное хранилище. Единственный случай, когда вы должны сохранять пользовательские изменения в постоянное хранилище во время вызова onPause() это когда вы уверены, что пользователи ожидают, что изменения будут автоматически сохранены (например, сохранения черновика при составлении письма). Тем не менее, вы должны избегать выполнения работы, требующей ресурсов процессора, во время вызова onPause(), таких как запись в базу данных, так как это может замедлить видимую часть перехода к следующей деятельности (вместо него вы должны выполнять тяжелые операции выгрузки во время onStop()).

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

Примечание: Когда ваша деятельность приостановлена, Activity экземпляр постоянно хранится в оперативной памяти, и будет использован, когда деятельность возобновится. Вам не нужно повторно инициализировать компоненты, которые были созданы во время любого из методов обратного вызова, ведущих к Resumed состоянию.

Возобновление вашей деятельности

Когда пользователь возобновляет вашу деятельность в Paused состоянии, система вызывает onResume() метод.

Имейте в виду, что система вызывает этот метод каждый раз, когда ваша деятельность переходит на передний план, в том числе, когда объект впервые создан. Таким образом, вы должны реализовать onResume() для инициализации компонентов, которые вы освободили во время onPause() и выполнить любые другие инициализации, которые должны происходить каждый раз, когда деятельность переходит в Resumed состояние (например, начать анимации и инициализировать компоненты, которые используются только в то время пока деятельность в фокусе пользователя).

Следующий пример onResume() является дополнением к 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
    }
}