← Назад к вопросам

Когда Activity может быть уничтожена?

2.0 Middle🔥 291 комментариев
#Android компоненты#Жизненный цикл и навигация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Когда Activity может быть уничтожена?

Activity — ключевой компонент Android-приложения, жизненный цикл которого напрямую зависит от политики управления памятью операционной системы и действий пользователя. Уничтожение Activity — штатная ситуация, и понимание её причин критически важно для создания стабильных приложений, способных корректно восстанавливать состояние.

Основные сценарии уничтожения Activity

1. По инициативе системы Android (системное уничтожение)

Это наиболее частый случай, когда ОС вынуждена освободить ресурсы.

  • Нехватка памяти: Когда другим приложениям или системным процессам с более высоким приоритетом (например, входящий звонок, активная камера) требуется оперативная память, система может завершить фоновые или невидимые Activity. Этот процесс управляется приоритетами процессов (Foreground, Visible, Service, Background, Empty).
  • Изменение конфигурации: Любое изменение в конфигурации устройства (поворот экрана, изменение языка, подключение клавиатуры) по умолчанию приводит к полному уничтожению и последующему пересозданию текущей Activity. Это сделано для загрузки альтернативных ресурсов (например, макетов из layout-land/).
  • Длительная бездеятельность на заднем плане: Система может агрессивно завершать Activity приложений, которые долгое время находятся в стэке "Назад" (back stack), особенно если устройство испытывает нехватку памяти.

2. По инициативе пользователя или приложения

  • Явный вызов finish(): Разработчик может завершить Activity программно, вызвав метод finish().
  • Пользователь закрывает приложение: Свайп приложения из списка недавних задач (recents screen) удаляет все Activity его задачи (task) из стэка.
  • Навигация "Вверх" (Up navigation): Нажатие "Назад" в панели инструментов (AppBar) часто приводит к вызову finish() для текущей Activity.
  • Переход к новой Activity с флагом FLAG_ACTIVITY_CLEAR_TOP: Если такая Activity уже существует в стэке, все Activity поверх неё будут уничтожены.

Ключевые методы жизненного цикла при уничтожении

При уничтожении Activity (кроме жесткого завершения процесса) система вызывает строго определённую последовательность методов:

  1. onPause(): Вызывается первым. Activity теряет фокус, но ещё видна (например, при прозрачной поверхностной Activity). Здесь следует остановить анимации или потребляющие CPU процессы.
  2. onStop(): Вызывается, когда Activity больше не видна пользователю. Здесь нужно освобождать тяжелые ресурсы (сетевые соединения, операции с базой данных).
  3. onSaveInstanceState(Bundle outState): Критически важный метод. Вызывается перед onStop(), если система предполагает возможность последующего восстановления (например, при повороте экрана или фоновом убийстве). В Bundle нужно сохранить текущее состояние UI (текст в полях, позицию прокрутки).
  4. onDestroy(): Финальный вызов. Может быть вызван либо потому, что Activity завершается (вызов finish()), либо потому, что система уничтожает её экземпляр для экономии памяти.
class MainActivity : AppCompatActivity() {

    private var userInputText: String = ""

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Сохраняем критичные данные для восстановления UI
        outState.putString("USER_INPUT_KEY", userInputText)
        outState.putInt("SCROLL_POSITION_KEY", recyclerView.computeVerticalScrollOffset())
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if (savedInstanceState != null) {
            // Восстанавливаем состояние после уничтожения
            userInputText = savedInstanceState.getString("USER_INPUT_KEY", "")
            val scrollPosition = savedInstanceState.getInt("SCROLL_POSITION_KEY", 0)
            recyclerView.scrollBy(0, scrollPosition)
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        // Отписываемся от глобальных слушателей, освобождаем ссылки на Context
        // НЕ рекомендуется здесь сохранять состояние - для этого есть onSaveInstanceState
    }
}

Как подготовить Activity к корректному уничтожению?

  1. Всегда переопределяйте onSaveInstanceState() для сохранения transient-состояния (не сохранённого в ViewModel или базе данных).
  2. Используйте ViewModel (компонент из Android Jetpack) для хранения данных, связанных с UI. ViewModel переживает изменение конфигурации и не уничтожается вместе с Activity в этом сценарии.
  3. Для постоянных данных используйте Room, DataStore или другие механизмы сохранения.
  4. Освобождайте ресурсы в onStop() или onDestroy(), чтобы избежать утечек памяти (memory leaks), особенно ссылки на Context, BroadcastReceivers, слушателей.
  5. Тестируйте сценарии: Включите в эмуляторе опцию "Don't keep activities" (в разделе Developer Options), чтобы симулировать агрессивное уничтожение системой после onStop().

Таким образом, уничтожение Activity — неотъемлемая часть её жизненного цикла в Android. Роль разработчика — не предотвратить его (это часто невозможно), а гарантировать, что важное состояние интерфейса и данные пользователя будут сохранены и корректно восстановлены при следующем создании экземпляра Activity.

Когда Activity может быть уничтожена? | PrepBro