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

Каким образом можно закрыть Activity?

1.6 Junior🔥 241 комментариев
#Android компоненты#Жизненный цикл и навигация

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

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

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

Методы закрытия Activity в Android

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

1. Использование метода finish()

Это базовый и наиболее прямой способ. Вызов метода finish() приводит к немедленному завершению текущей Activity. Система затем вызывает onDestroy(), и Activity удаляется из памяти.

class MyActivity : AppCompatActivity() {
    fun closeActivity() {
        finish()
    }
}

Важные особенности:

  • При вызове finish() Activity не возвращается в стек.
  • Если это была последняя Activity в стеке, приложение обычно закрывается (или возвращается к предыдущему приложению).
  • Метод работает в контексте текущей Activity.

2. Завершение с передачей результата (setResult() и finish())

При использовании startActivityForResult() (или современного Activity Result API) необходимо установить результат перед закрытием.

class ChildActivity : AppCompatActivity() {
    fun returnWithResult() {
        val data = Intent()
        data.putExtra("RESULT_KEY", "Some data")
        setResult(Activity.RESULT_OK, data)
        finish()
    }
}

3. Запуск новой Activity с флагом FLAG_ACTIVITY_CLEAR_TASK

Можно закрыть текущую Activity и весь её стек задач, запустив новую Activity с определенными флагами в Intent.

val intent = Intent(this, NewActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(intent)
finish() // Завершаем текущую Activity

Флаг FLAG_ACTIVITY_CLEAR_TASK очищает весь стек задач перед запуском новой Activity.

4. Системное закрытие через onBackPressed()

Нажатие системной кнопки "Back" автоматически вызывает закрытие Activity. Можно переопределить это поведение.

override fun onBackPressed() {
    // Можно выполнить дополнительные действия
    if (shouldClose) {
        super.onBackPressed() // Стандартное закрытие
    } else {
        // Отменить закрытие или выполнить альтернативную логику
    }
}

5. Использование finishAffinity()

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

fun closeActivityGroup() {
    finishAffinity()
}

6. Завершение всех Activity в приложении (finishAndRemoveTask())

Введён в API 21 (Android 5.0). Завершает все Activity в текущей задаче и удаляет саму задачу из системы.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    finishAndRemoveTask()
}

7. Сценарий с startActivity() и автоматическим закрытием

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

Ключевые различия и рекомендации

  • finish() — стандартный метод для простого закрытия.
  • finishAffinity() — для закрытия логически связанной группы.
  • Флаги Intent — для управления стеком задач при переходе между Activity.
  • finishAndRemoveTask() — для полного завершения задачи (современные API).

При выборе метода важно учитывать:

  • Необходимость передачи данных между Activity.
  • Структуру стека задач и логику navigation.
  • Версию Android API (для методов, требующих определённого уровня).
  • Обработку жизненного цикла и сохранение состояния.

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

Каким образом можно закрыть Activity? | PrepBro