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 — так вы избежите большинства проблем и подготовите проект к росту.