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

Что происходит при вызове finish() из onCreate()? Какие callback методы будут вызваны?

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

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

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

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

Краткий ответ

При вызове finish() из onCreate() происходит следующее: система немедленно начинает процесс уничтожения Activity, но при этом гарантированно будут выполнены все обязательные callback'и жизненного цикла. Activity перейдет в состояние "уничтожается", минуя видимые для пользователя состояния (onStart(), onResume()).

Детальное объяснение процесса

Когда вы вызываете finish() на раннем этапе, например в onCreate(), система обрабатывает это как запрос на завершение Activity. Однако, поскольку жизненный цикл уже начался, Android обеспечивает корректное прохождение через необходимые этапы.

Последовательность вызова callback-методов

Вызов finish() из onCreate() приводит к следующей последовательности:

  1. onCreate() — метод, в котором вызван finish().
  2. onStart() — будет вызван сразу после завершения onCreate(), до фактического уничтожения.
  3. onResume() — также будет вызван кратковременно, но пользователь не успеет увидеть интерфейс.
  4. onPause() — вызывается немедленно после onResume(), так как система начинает приостанавливать Activity.
  5. onStop() — вызывается после onPause().
  6. onDestroy() — финальный метод, завершающий уничтожение Activity.

Визуально это можно представить так:

public class ExampleActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);
        
        Log.d("Lifecycle", "onCreate() вызван");
        
        // Ранний вызов finish()
        finish();
        Log.d("Lifecycle", "finish() вызван в onCreate()");
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        Log.d("Lifecycle", "onStart() вызван после finish()");
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        Log.d("Lifecycle", "onResume() вызван кратковременно");
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        Log.d("Lifecycle", "onPause() вызван");
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        Log.d("Lifecycle", "onStop() вызван");
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Lifecycle", "onDestroy() вызван");
    }
}

В логах будет следующая последовательность:

onCreate() вызван
finish() вызван в onCreate()
onStart() вызван после finish()
onResume() вызван кратковременно
onPause() вызван
onStop() вызван
onDestroy() вызван

Почему так происходит?

Система Android спроектирована для обеспечения целостности жизненного цикла:

  • Гарантия парности вызовов — если был вызван onCreate(), то должен быть вызван и onDestroy(). Промежуточные методы onStart()/onStop() и onResume()/onPause() также вызываются парами.
  • Предсказуемое поведение — компоненты (например, LifecycleObserver) ожидают определенной последовательности событий.
  • Безопасность ресурсов — система гарантирует, что все методы жизненного цикла выполнятся в правильном порядке для корректного управления ресурсами.

Практические последствия и use-cases

Типичные сценарии использования finish() в onCreate():

  1. Перенаправление на другую Activity — если текущая Activity больше не нужна (например, после проверки авторизации):
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    if (!userIsLoggedIn()) {
        startActivity(Intent(this, LoginActivity::class.java))
        finish() // Закрываем текущую Activity
        return
    }
    
    setContentView(R.layout.activity_main)
}
  1. Валидация входных данных — если параметры интента некорректны:
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    val itemId = intent.getLongExtra("ITEM_ID", -1L)
    if (itemId == -1L) {
        // Некорректные параметры, закрываем Activity
        Toast.makeText(this, "Invalid item", Toast.LENGTH_SHORT).show()
        finish()
        return
    }
}
  1. Обработка конфигураций — когда Activity не поддерживает текущую конфигурацию устройства.

Важные нюансы

  • Анимации перехода — не будут показаны, так как Activity не успевает стать видимой.
  • Состояние UI — любые операции с UI после finish() могут привести к исключениям, если они пытаются обновить уже уничтожающийся View.
  • Асинхронные операции — запущенные в onCreate() асинхронные задачи могут продолжить выполнение после вызова finish(), что требует обработки сценария отмены.

Вывод

finish() в onCreate() не прерывает жизненный цикл, а лишь планирует завершение Activity после выполнения всех обязательных callback-методов. Это безопасный механизм, который обеспечивает целостность жизненного цикла, но требует понимания того, что onStart() и onResume() все равно будут вызваны кратковременно.