Остановка и перезапуск явлений

В данном уроке мы рассмотрим

Также рекомендуем прочитать

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

  • Пользователь открыл окно “последние приложения” и переключился на другое приложение. Явление, которое на этот момент было активным остановится. Когда пользователь снова запустит приложение (неважно из окна последних приложений или с рабочего стола), явление перезапустится.
  • Пользователь запустил другое явление вашего приложения. Текущее явление остановится. Когда пользователь нажмет кнопку назад, явление перезапустится.
  • Телефонный вызов заставит явление остановиться.

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

Примечание:поскольку после остановки система хранит экземпляр Activity в памяти, возможно вам не придется в каждом проект использовать методыonStop(), onRestart() и onStart(). Большинство явлений довольно простые и прекрасно останавливаются и перезапускаются без вмешательства с вашей стороны. Чаще вам будет необходим метод onPause().

схема остановки и перезапуска явления

Рисунок 1.Когда пользователь покидает явление, система вызывает onStop() для его остановки (1). При повторном открытии явления, система вызывает onRestart() (2), onStart() (3) и onResume() (4). Помните, что назависимо от причин остановки явления, система всегда вызывает onPause() перед вызовом onStop().

Остановка вашего Явления

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

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

Ниже показан пример метода onStop(), который сохраняет черновик записи в постоянное хранилище:

Объект явления типа Activity хранится в памяти после его остановки и вызывается при возобновлении. Вам не нужно заново инициализировать компоненты, которые были созданы во время методов, ведущих к возобновленному состоянию. Система также сохраняет состояние каждого элемента разметки. Если пользователь ввел строку в текстовое поле, его содержание сохранится и вам не надо об этом заботиться.

Примечание:Даже если система уничтожила ваше явление, пока оно было остановлено, состояние элементов разметки (объектов типа View, такие как тестовое поле EditText) сохраняется в объекте типа Bundle(пары ключ-значение) и восстанавливаются, когда пользователь возвращается к экземпляру явления. В следующем уроке мы рассмотрим подробнее использование объектов Bundle для сохранения данных в случае уничтожения и пересоздания явлений.

Запуск и перезапуск явления

Когда вы заново активируете явление после его остановки, вызывается метод onRestart(). Система также вызывает метод onStart(), который срабатывает каждый раз, когда приложение становится видимым(неважно было оно запущено впервые или перезапущено). В то же время метод onRestart() вызывается только когда приложение возвращается из остановленного состояния. В нем вы можете выполнять действия, для явлений, которые были остановлены, но не уничтожены.

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

Поскольку пользователь может надолго закрыть ваше приложение, метод onStart() подходит лучше всего для проверки существования всех необходимых обектов:

Если система уничтожила экземпляр явления, будет вызван метод onDestroy(). Поскольку в большинстве случаев ресурсы освобождаются в методе onStop(), большинству приложений не придется использовать onDestroy(). Данный метод это последний шанс очистить ресурсы, пожирающие память. Убедитесь, что вы уничтожили все дополнительные процессы и потоки.

Добавить комментарий