В чём разница между Fragment и Activity?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные различия между Fragment и Activity
Activity и Fragment - это два фундаментальных компонента Android-приложений, каждый из которых играет свою уникальную роль в архитектуре.
Activity: Основная единица UI
Activity представляет собой отдельный экран с пользовательским интерфейсом. Это точка входа для взаимодействия пользователя с приложением, управляемая системой через стек Activity (back stack).
Ключевые характеристики Activity:
- Самостоятельный компонент - может существовать независимо в манифесте приложения
- Жизненный цикл управляется системой:
onCreate(),onStart(),onResume(),onPause(),onStop(),onDestroy() - Контекст приложения - предоставляет контекст (
thisилиgetApplicationContext()) - Точка входа в приложение, объявляется в
AndroidManifest.xml - Окно приложения - занимает весь экран или работает в многооконном режиме
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Инициализация UI и логики Activity
}
override fun onResume() {
super.onResume()
// Возобновление работы при возврате на экран
}
}
Fragment: Модульный компонент UI
Fragment представляет собой модульную часть пользовательского интерфейса, которая встраивается в Activity. Несколько Fragment могут работать внутри одной Activity, обеспечивая гибкую и адаптивную компоновку.
Ключевые характеристики Fragment:
- Зависимый компонент - должен быть размещен внутри Activity
- Собственный жизненный цикл, связанный с жизненным циклом родительской Activity
- Повторное использование - один Fragment может использоваться в разных Activity
- Адаптивность - позволяет создавать разные макеты для телефонов и планшетов
- Back stack FragmentManager - собственная система управления стеком фрагментов
class DetailsFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_details, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Инициализация элементов UI фрагмента
}
}
Сравнительная таблица
| Критерий | Activity | Fragment |
|---|---|---|
| Независимость | Самостоятельный компонент | Зависит от Activity |
| Манифест | Объявляется в AndroidManifest.xml | Не объявляется в манифесте |
| Жизненный цикл | Управляется системой | Управляется FragmentManager |
| Контекст | Имеет собственный контекст | Использует контекст Activity |
| Назначение | Полноценный экран | Часть экрана или весь экран |
| Повторное использование | Ограниченное | Высокая степень повторного использования |
| Back stack | Системный стек Activity | Стек FragmentManager |
Архитектурные различия
Activity как контроллер:
- Управляет несколькими Fragment
- Обрабатывает навигацию между экранами
- Координирует взаимодействие между Fragment
- Обрабатывает системные события (permissions, intents)
Fragment как представление:
- Инкапсулирует конкретную функциональность UI
- Может общаться с другими Fragment через родительскую Activity
- Легко заменяется и комбинируется
Практические сценарии использования
Когда использовать Activity:
- Основные экраны приложения (главный экран, детали, настройки)
- Обработка глубоких ссылок (deep links)
- Работа с системными компонентами (камера, галерея)
- Точки входа приложения (launcher activity)
Когда использовать Fragment:
- Табы (ViewPager/TabLayout) внутри Activity
- Адаптивные интерфейсы для разных размеров экрана
- Многопанельные интерфейсы на планшетах
- Динамическая замена частей UI без пересоздания всего экрана
- BottomNavigationView с несколькими экранами
Критические аспекты взаимодействия
-
Коммуникация: Fragment никогда не должен общаться напрямую с другими Fragment. Вместо этого используется родительская Activity как посредник или ViewModel.
-
Внедрение зависимости: Fragment получает зависимости через родительскую Activity или с использованием Dagger/Hilt с scope Fragment.
-
Обработка конфигураций: Fragment сохраняет состояние через
onSaveInstanceState(), но управление памятью сложнее из-за привязки к жизненному циклу Activity.
Современные подходы
В современной Android-разработке с внедрением Jetpack Navigation Component границы между Activity и Fragment стираются:
- Single-Activity архитектура становится стандартом
- Fragment выступают как destinations в графе навигации
- Activity становится контейнером для NavHostFragment
Основной вывод: Activity - это контейнер для управления окном приложения и системными взаимодействиями, тогда как Fragment - это модульные, повторно используемые компоненты UI, которые обеспечивают гибкость и адаптивность интерфейса. Современные приложения часто используют одну главную Activity с множеством Fragment, что соответствует принципам чистой архитектуры и упрощает навигацию.