Как 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>:
<activity android:name=".WebViewActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="https" />
</intent-filter>
</activity>
→ Если найден один компонент — он запускается.
→ Если найдено несколько — система показывает 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, например:
<activity android:name=".ShareReceiverActivity">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
🔐 Влияние 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 в качестве аргумента.