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

В чём разница между onCreate и onStart?

1.2 Junior🔥 61 комментариев

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

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

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

Разница между onCreate и onStart в Android

Функции onCreate и onStart являются ключевыми методами Activity Lifecycle (жизненного цикла активности) в Android. Они вызываются системой в строгой последовательности при создании и управлении состоянием Activity. Понимание их различий критично для правильной архитектуры приложения и управления ресурсами.

Основная роль onCreate

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

Основные задачи, выполняемые в onCreate:

  • Инициализация основных компонентов: создание ViewModel, настройка адаптеров для RecyclerView, получение ссылок на сервисы.
  • Связывание layout (макета) с Activity: вызов setContentView().
  • Восстановление состояния: обработка savedInstanceState для восстановления UI после уничтожения Activity (например, из-за конфигурационных изменений).
  • Настройка статических элементов: регистрация долгосрочных слушателей, которые не должны меняться часто.

Пример использования onCreate:

class MainActivity : AppCompatActivity() {

    private lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState) // Вызов родительского метода обязателен
        setContentView(R.layout.activity_main) // Установка макета

        // Восстановление состояния (например, текста в EditText)
        val restoredText = savedInstanceState?.getString("editTextKey")

        // Инициализация ViewModel (однократно)
        viewModel = ViewModelProvider(this).get(MainViewModel::class.java)

        // Настройка статических компонентов
        val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
        recyclerView.adapter = MyAdapter() // Установка адаптера
    }
}

Основная роль onStart

Метод onStart() вызывается после onCreate и перед тем, как Activity становится видимым для пользователя. Его основная задача — подготовка к отображению UI и запуск ресурсов, связанных с видимостью.

Основные задачи, выполняемые в onStart:

  • Запуск процессов, которые должны работать только когда Activity видна: обновление данных в UI из локальной базы или памяти, запуск анимаций.
  • Регистрация динамических слушателей: подключение BroadcastReceiver, которые реагируют на системные события (например, изменения сети), но только когда Activity активна.
  • Подготовка к взаимодействию с пользователем: предварительная загрузка данных, которые будут отображены, но не затратная инициализация.

Пример использования onStart:

class MainActivity : AppCompatActivity() {

    private val networkChangeReceiver = NetworkChangeReceiver()

    override fun onStart() {
        super.onStart() // Вызов родительского метода обязателен
        // Запуск процессов, зависящих от видимости
        viewModel.loadUserData() // Загрузка данных для отображения

        // Регистрация слушателя, который нужен только когда Activity видна
        registerReceiver(
            networkChangeReceiver,
            IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
        )
    }

    override fun onStop() {
        super.onStop()
        // Снятие регистрации в onStop, когда Activity становится невидимой
        unregisterReceiver(networkChangeReceiver)
    }
}

Ключевые различия в сравнительной таблице

КритерийonCreateonStart
Порядок вызоваПервый метод при создании Activity.Вызывается после onCreate и перед onResume.
Количество вызововОдин раз за жизненный цикл (если Activity не уничтожается).Может вызываться многократно (при возвращении из onStop).
Основная цельБазовая, статическая инициализация (макет, ViewModel).Подготовка к видимости и запуск ресурсов, связанных с UI.
Визуальное состояниеActivity не видима пользователю.Activity становится видимой, но еще не в фокусе (не взаимодействует).
Следующий методonStart (или onRestart, если возвращение из onStop).onResume (Activity получает фокус и готово к взаимодействию).
Логика восстановленияВосстановление состояния через savedInstanceState.Часто восстановление данных из памяти/ViewModel (которые сохранились).

Важное практическое правило

  • Все, что нужно инициализировать один раз и не зависит от видимости (макет, адаптер, ViewModel) — помещайте в onCreate.
  • Все, что должно работать или обновляться только когда Activity видна, и может быть остановлено при скрытии (регистрация слушателей, обновление данных на экране) — помещайте в onStart (и останавливайте/снимайте в onStop).

Ошибка: Регистрация BroadcastReceiver в onCreate без unregister в onDestroy приведет к утечке памяти и потенциальным вызовам, когда Activity не видна. Правильно — регистрировать в onStart и снимать в onStop.

Таким образом, onCreate — этап рождения активности, а onStart — этап ее показа на сцене, перед тем как она начинает активно взаимодействовать с пользователем в onResume. Их четкое разделение обеспечивает эффективное управление ресурсами и предотвращает баги, связанные с жизненным циклом.