Остановка и перезапуск Activity

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

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

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

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

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

[wpanchor id=»1″]

Остановка вашей activity


Когда ваша activity получает вызов onStop() метода, уже ничего не видно и вы должны освободить почти все ресурсы, которые не нужны, пока пользователь их не использует. После того, как ваша activity прекращается, система может уничтожить экземпляр, если это необходимо для восстановления системной памяти. В крайних случаях, система может просто убить ваш процесс приложения без вызова финального 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 остановлена, Activity объект остается в оперативной памяти, и снова используется, когда activity возобновляет работу. Вам не нужно повторно инициализировать компоненты, которые были созданы в любом из методов обратного вызова, ведущего к Resumed состоянию. Система также отслеживает текущее состояние для каждого View в макете, так что если пользователь ввел текст в EditText виджет, то это содержание сохраняется, поэтому вам не нужно сохранять и восстанавливать его.

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

[wpanchor id=»2″]

Запуск/перезапуск вашей activity


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

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

Например, т.к. пользователь, возможно, был далеко от вашего приложения в течение длительного времени прежде чем вернуться к нему, 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    
}

 

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

 

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