Как система понимает, какую активити запускать?
Система Android понимает, какую Activity запускать при старте приложения, анализируя манифест (AndroidManifest.xml) и ища активность, у которой указаны интент-фильтры с действием MAIN и категорией LAUNCHER. Это — точка входа в приложение, аналог main() в языках вроде Java или C++.
🔍 Ключевой фрагмент в манифесте
<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>
📌 Как это работает
-
Во время установки приложения Android читает AndroidManifest.xml.
-
Система ищет Activity, которая содержит:
-
intent-filter с action = android.intent.action.MAIN
-
category = android.intent.category.LAUNCHER
-
-
Найденная Activity становится запускаемой из лаунчера и используется как стартовая, когда пользователь нажимает на иконку приложения.
🧠 Что делают action и category
-
android.intent.action.MAIN
Обозначает: это основная точка входа в приложение. Только одна активность в приложении должна содержать эту метку. -
android.intent.category.LAUNCHER
Говорит системе и лаунчеру: эту активность нужно показывать в списке приложений и запускать при старте.
Если убрать категорию LAUNCHER, активность не появится в списке приложений.
Что будет, если указать MAIN, но не LAUNCHER?
Приложение не будет отображаться в лаунчере. Такая активность может быть предназначена только для внутреннего запуска, например, по Intent из другого компонента.
Что происходит при старте приложения
- Пользователь нажимает на иконку приложения.
Система создаёт Intent:
Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER)
-
Смотрит в PackageManager, какая активность в этом приложении соответствует этому фильтру.
-
Запускает найденную Activity.
⚠️ Что если несколько активностей с MAIN + LAUNCHER?
-
Android разрешает только одну активность с таким фильтром в манифесте.
-
Если их несколько — приложение не скомпилируется или поведение станет непредсказуемым.
-
Однако можно программно переключать стартовую активность, временно изменяя intent-фильтры через PackageManager.
📦 Альтернативы
Иногда приложения запускаются не из лаунчера, а через:
-
BroadcastReceiver — по событию (например, будильник).
-
Service — для фоновой работы.
-
PendingIntent — при клике на уведомление.
-
Вызов startActivity(Intent) — при переходе внутри самого приложения.
Но всё это возможно только если в системе уже есть точка входа, определённая через MAIN + LAUNCHER.
Итого
Система Android определяет, какую Activity запускать при старте, по наличию intent-фильтра с MAIN и LAUNCHER в AndroidManifest.xml. Это поведение заложено в системе и необходимо, чтобы приложение появилось в списке приложений и стало доступно пользователю.