Activity и MainActivity — кратко и по делу

Activity — это отдельный экран приложения (UI + логика), а MainActivity обычно объявляется как точка входа (intent-filter MAIN + LAUNCHER). Ниже — что в проекте отвечает за Activity, как создать и зарегистрировать MainActivity, и как корректно работать с её жизненным циклом.

Структура проекта: где находятся Activity и макеты

Ключевые места в модуле app:

  • app/src/main/java/... — Kotlin/Java классы, тут MainActivity.kt.
  • app/src/main/res/layout — XML-макеты (activity_main.xml).
  • app/src/main/AndroidManifest.xml — регистрация Activity и точка входа.
  • build.gradle (Module: app) — зависимости (Compose, Navigation и т.д.).

Пример записи в AndroidManifest.xml для стартовой Activity:

<activity android:name=".MainActivity" android:exported="true">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

Если используете Jetpack Compose, макет может не быть в res/layout — UI задаётся в setContent { } внутри Activity.

Создание и настройка MainActivity (Kotlin, 2026)

Базовый шаблон с Compose:

class MainActivity : ComponentActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
      MyAppTheme {
        Surface(modifier = Modifier.fillMaxSize()) {
          Greeting("Android")
        }
      }
    }
  }
}
@Composable fun Greeting(name: String) { Text("Hello $name!") }

Если не используете Compose:

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

Как добавить Activity: правой кнопкой на package → New → Activity → Empty Activity — Studio создаст класс и запись в манифест (при необходимости).

Используйте Kotlin и ViewModel + Flow/LiveData для управления состоянием — код короче, меньше утечек памяти.

Жизненный цикл Activity: что и где делать

Ключевые коллбэки и рекомендуемые действия:

  • onCreate(): инициализация UI, ViewModel, подписки.
  • onStart(): Activity видима — запуск анимаций.
  • onResume(): Activity на переднем плане — возобновить ввод, камеры, таймеры.
  • onPause(): сохранить данные, приостановить тяжёлые операции.
  • onStop(): освободить ресурсы, остановить анимации.
  • onDestroy(): окончательная очистка (отписки, закрыть базы).
  • onRestart(): возврат после onStop().

Не держите тяжёлые операции в onResume() — используйте ViewModel и корутины, отменяйте их в onDestroy().

Короткая таблица состояний

МетодВидимаФокусЧто делать
onCreateнетнетИнициализация
onStartданетПодготовка UI
onResumeдадаВзаимодействие
onPauseданетСохранение состояния
onStopнетнетОсвобождение ресурсов
onDestroyнетнетФинальная очистка

Не храните большие объекты в Activity (Context) — используйте ViewModel и applicationContext для длительных ресурсов.

Переходы, передача данных и лучшие практики

  • Запуск другой Activity:
    • Intent: startActivity(Intent(this, SecondActivity::class.java))
    • Для результата используйте Activity Result API (registerForActivityResult), а не устаревший startActivityForResult.
  • Передача данных: intent.putExtra / intent.getParcelableExtra, но для больших объёмов — общий ViewModel или навигационный хост.
  • Навигация: Jetpack Navigation (для XML/Fragments) или Navigation Compose. Лучше держать минимальный набор Activity и управлять экранами через фрагменты/навигацию — проще сохранять состояние.
  • Работа с долгими задачами: ViewModel + coroutineScope + lifecycleScope, LiveData/Flow для обновления UI.

Частые ошибки

  • Хранение контекста Activity в синглтонах → утечки памяти.
  • Тяжёлые операции в onResume/onCreate без асинхронности → подвисания UI.
  • Не регистрировать Activity в манифесте (особенно при ручном создании) — экран не откроется.
  • Использование startActivityForResult вместо Activity Result API.
  • Сложная навигация без NavHost → рост числа Activity и дублирование кода.

FAQ

  • Нужно ли каждая "страница" приложения делать отдельной Activity?
    • Нет. Обычно используют одну Activity как контейнер и навигацию (фрагменты/Compose Nav) для экранов.
  • Как хранить состояние при повороте экрана?
    • ViewModel + SavedStateHandle или onSaveInstanceState для простых данных.
  • Когда использовать Fragment vs Compose?
    • Compose — современный инструмент для UI. Фрагменты актуальны в смешанных проектах или при переходном периоде.

Стартуйте с простой MainActivity, выносьте логику в ViewModel, и используйте Navigation — так вы избежите большинства проблем и подготовите проект к росту.