Как Intent будет ловиться в системе?

Когда в Android создаётся и отправляется Intent, система Android обрабатывает его в несколько этапов, чтобы найти подходящие компоненты-приметчики (Activity, Service, BroadcastReceiver) и доставить сообщение. Механизм ловли Intent зависит от его типа: явный или неявный, и от целевого компонента.

🔁 Основные типы Intent

1. Явный (explicit) Intent

Указывает конкретный класс получателя — например, запуск определённой Activity:

val intent = Intent(this, DetailActivity::class.java)
startActivity(intent)

Система сразу знает, кому передать Intent, и напрямую вызывает компонент.

2. Неявный (implicit) Intent

Содержит действие (action), категорию, тип данных и т. д., но не указывает конкретный класс. Например:

val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://google.com")
startActivity(intent)

→ Система ищет подходящий компонент с подходящим <intent-filter> в AndroidManifest.xml.

📡 Как система ловит Intent

1. Intent передаётся через system service

Вызовы startActivity(), startService(), sendBroadcast() и т. п. — это обращения к системной службе ActivityManagerService, которая занимается маршрутизацией Intent.

2. Система анализирует Intent

Она проверяет:

  • Тип действия (action) — например, android.intent.action.VIEW.

  • Data URI — например, content://, tel:, https://.

  • Категории (category) — например, android.intent.category.DEFAULT.

  • Тип MIME — image/*, text/plain.

  • Права доступа (permissions).

3. Intent-сопоставление с intent-filter

Если Intent неявный, система ищет компоненты (в манифесте приложений), которые соответствуют всем условиям в <intent-filter>:

&lt;activity android:name=".WebViewActivity"&gt;
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.VIEW" /&gt;
&lt;category android:name="android.intent.category.DEFAULT" /&gt;
&lt;data android:scheme="https" /&gt;
&lt;/intent-filter&gt;
&lt;/activity&gt;

→ Если найден один компонент — он запускается.
→ Если найдено несколько — система показывает chooser (диалог выбора).
→ Если не найдено ни одного — приложение может упасть с ActivityNotFoundException.

4. Передача Intent нужному компоненту

Когда компонент определён:

  • Activity: вызывается метод onCreate() или onNewIntent() (если уже запущена).

  • Service: вызывается onStartCommand() или onBind().

  • BroadcastReceiver: вызывается onReceive().

Особенности ловли по компонентам

📱 Для Activity

  • startActivity(intent) — ловит либо явно указанную Activity, либо выбирает по intent-filter.

  • startActivityForResult() — устаревший API, заменён на ActivityResultLauncher.

⚙️ Для Service

  • startService() — запускает сервис, если не запущен.

  • bindService() — связывает компонент с сервисом (через ServiceConnection).

  • Работает с явными Intent, особенно с Android 5+.

📻 Для BroadcastReceiver

  • sendBroadcast() — рассылает неупорядоченный broadcast всем зарегистрированным приёмникам.

  • sendOrderedBroadcast() — поочерёдно доставляет Intent в порядке приоритета.

  • sendStickyBroadcast() — устарел.

📝 Пример: ловля Intent неявным способом

val intent = Intent(Intent.ACTION_SEND)
intent.type = "text/plain"
intent.putExtra(Intent.EXTRA_TEXT, "Hello")
startActivity(Intent.createChooser(intent, "Поделиться через:"))

Этот Intent будет обработан любым приложением, которое объявило соответствующий intent-filter, например:

&lt;activity android:name=".ShareReceiverActivity"&gt;
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.SEND" /&gt;
&lt;category android:name="android.intent.category.DEFAULT" /&gt;
&lt;data android:mimeType="text/plain" /&gt;
&lt;/intent-filter&gt;
&lt;/activity&gt;

🔐 Влияние exported, permissions, flags

  • С Android 12 и выше, компоненты с intent-filter обязаны иметь android:exported="true" или false — иначе приложение не запустится.

  • Можно ограничивать приём Intent через permissions.

  • Флаги типа FLAG_ACTIVITY_NEW_TASK, FLAG_RECEIVER_FOREGROUND и др. могут менять поведение запуска.

Таким образом, ловля Intent в системе — это механизм сопоставления параметров Intent с intent-filter зарегистрированных компонентов. Система Android определяет подходящий компонент и вызывает его метод (onCreate, onReceive, onStartCommand и т.д.), передавая Intent в качестве аргумента.