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

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

  1. Остановка вашей деятельности
  2. Запуск/перезапуск вашей деятельности

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

Попробуйте

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

ActivityLifecycle.zip

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

  • Пользователь открывает окно Недавние приложения и переключается с вашего приложения на другое приложение. Деятельность вашего приложения, находящаяся в это время на переднем плане, останавливается. Если пользователь возвращается в ваше приложении с помощью значка запуска главного экрана или окна Недавние приложения, деятельность перезагружается.
  • Пользователь выполняет действие в вашем приложении, которое начинается новую деятельность. Текущая деятельность будет остановлена, когда вторая деятельность будет создана. Если пользователь затем нажимает кнопку Назад , первая деятельность перезапустится.
  • Пользователь получает телефонный звонок во время использования приложения на его или ее телефоне.

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

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

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

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

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

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

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

@Override
protected void onStop() {
    super.onStop();  // Always call the superclass method first

    // Save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver().update(
            mUri,    // The URI for the note to update.
            values,  // The map of column names and new values to apply to them.
            null,    // No SELECT criteria are used.
            null     // No WHERE columns are used.
            );
}

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

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

Запуск/перезапуск вашей деятельности

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

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

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

@Override
protected void onStart() {
    super.onStart();  // Always call the superclass method first
    
    // The activity is either being restarted or started for the first time
    // so this is where we should make sure that GPS is enabled
    LocationManager locationManager = 
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    
    if (!gpsEnabled) {
        // Create a dialog here that requests the user to enable GPS, and use an intent
        // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
        // to take the user to the Settings screen to enable GPS when they click "OK"
    }
}

@Override
protected void onRestart() {
    super.onRestart();  // Always call the superclass method first
    
    // Activity being restarted from stopped state    
}

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