Как система понимает, какую активити запускать?

Система Android понимает, какую Activity запускать при старте приложения, анализируя манифест (AndroidManifest.xml) и ища активность, у которой указаны интент-фильтры с действием MAIN и категорией LAUNCHER. Это — точка входа в приложение, аналог main() в языках вроде Java или C++.

🔍 Ключевой фрагмент в манифесте

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

📌 Как это работает

  1. Во время установки приложения Android читает AndroidManifest.xml.

  2. Система ищет Activity, которая содержит:

    • intent-filter с action = android.intent.action.MAIN

    • category = android.intent.category.LAUNCHER

  3. Найденная Activity становится запускаемой из лаунчера и используется как стартовая, когда пользователь нажимает на иконку приложения.

🧠 Что делают action и category

  • android.intent.action.MAIN
    Обозначает: это основная точка входа в приложение. Только одна активность в приложении должна содержать эту метку.

  • android.intent.category.LAUNCHER
    Говорит системе и лаунчеру: эту активность нужно показывать в списке приложений и запускать при старте.

Если убрать категорию LAUNCHER, активность не появится в списке приложений.

Что будет, если указать MAIN, но не LAUNCHER?

Приложение не будет отображаться в лаунчере. Такая активность может быть предназначена только для внутреннего запуска, например, по Intent из другого компонента.

Что происходит при старте приложения

  1. Пользователь нажимает на иконку приложения.

Система создаёт Intent:

Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER)
  1. Смотрит в PackageManager, какая активность в этом приложении соответствует этому фильтру.

  2. Запускает найденную Activity.

⚠️ Что если несколько активностей с MAIN + LAUNCHER?

  • Android разрешает только одну активность с таким фильтром в манифесте.

  • Если их несколько — приложение не скомпилируется или поведение станет непредсказуемым.

  • Однако можно программно переключать стартовую активность, временно изменяя intent-фильтры через PackageManager.

📦 Альтернативы

Иногда приложения запускаются не из лаунчера, а через:

  • BroadcastReceiver — по событию (например, будильник).

  • Service — для фоновой работы.

  • PendingIntent — при клике на уведомление.

  • Вызов startActivity(Intent) — при переходе внутри самого приложения.

Но всё это возможно только если в системе уже есть точка входа, определённая через MAIN + LAUNCHER.

Итого

Система Android определяет, какую Activity запускать при старте, по наличию intent-фильтра с MAIN и LAUNCHER в AndroidManifest.xml. Это поведение заложено в системе и необходимо, чтобы приложение появилось в списке приложений и стало доступно пользователю.