Intent Filter — это декларативное объявление в AndroidManifest.xml, которое указывает системе, какие неявные намерения способен обрабатывать компонент приложения. По данным Android Developer Guide, фильтр содержит action, category и data, на основе которых система маршрутизирует вызовы от других приложений и системных событий. Android-разработка использует Intent Filter как основной механизм слабой связности между компонентами разных приложений.
Главное
Intent Filter — это элемент конфигурации Android-приложения, который сообщает системе о возможности компонента обрабатывать определённые типы неявных намерений. В отличие от явных Intent, указывающих конкретный класс, неявные Intent содержат только описание требуемого действия, а система сама находит подходящий компонент на основе зарегистрированных фильтров.
Фильтры объявляются внутри компонента — Activity, Service или BroadcastReceiver — в файле AndroidManifest.xml. Каждый фильтр может содержать несколько элементов action, category и data. Компонент может иметь неограниченное количество Intent Filter, каждый из которых описывает отдельный сценарий обработки.
Intent Filter реализует принцип слабой связанности между компонентами приложений. Приложение A не обязано знать о существовании приложения B — оно просто отправляет Intent с описанием действия, а система маршрутизирует его на основе фильтров. Этот механизм лежит в основе Share Sheet, выбора браузера и обработки deep link.
Явные Intent указывают конкретный класс компонента для запуска. Они используются для внутренней навигации внутри одного приложения, когда разработчик точно знает, какая Activity должна открыться. Неявные Intent содержат только описание действия, а компонент определяется системой динамически.
Intent Filter работает исключительно с неявными Intent. Если в Intent указан конкретный класс, система игнорирует все фильтры и запускает указанный компонент напрямую. Фильтры проверяются только при разрешении неявных вызовов, что делает их ключевым элементом межприкладного взаимодействия.
| Характеристика | Явный Intent | Неявный Intent |
|---|---|---|
| Компонент | Указан явно (className) | Определяется системой |
| Intent Filter | Не требуется | Обязателен |
| Пример | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse("https://example.com")) |
| Безопасность | Выше (нет перехвата) | Ниже (возможны конфликты) |
Каждый Intent Filter состоит из трёх групп элементов — action, category и data — комбинация которых определяет, какие Intent будет получать компонент. Фильтр считается пройденным, если Intent соответствует хотя бы одному элементу каждой группы.
Action описывает выполняемое действие — просмотр, редактирование, отправку. Category добавляет дополнительный контекст обработки — например, возможность запуска из браузера. Data определяет формат обрабатываемой информации через URI или MIME-тип.
Пример Intent Filter для Activity, открывающей ссылки на профили пользователей. Фильтр включает все три группы элементов для точной маршрутизации.
<activity android:name=".ProfileActivity">
<intent-filter>
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="myapp"
android:host="profile" />
</intent-filter>
</activity>
Обратите внимание на обязательное указание category DEFAULT — без неё система не будет передавать компоненту неявные Intent. Категория BROWSABLE добавляется, если ссылка должна обрабатываться из браузера.
Deep link на Android настраивается через Intent Filter с action VIEW и тегом data, содержащим схему, хост и путь. При переходе по ссылке вида myapp://profile/42 система находит Activity с подходящим фильтром и запускает её с переданным URI. Важно правильно настроить pathPrefix, pathPattern или path для точного сопоставления.
Начиная с Android 6 (API 23) появилась поддержка App Links — верифицированных deep link через HTTPS. Для App Links используется тот же Intent Filter, но с дополнительной верификацией домена через Digital Asset Links. После верификации система автоматически открывает приложение без диалога выбора.
Пример фильтра для App Link с верификацией через HTTPS-ссылку. В этом случае схема всегда https, а хост соответствует домену, указанному в Digital Asset Links.
<intent-filter android:autoVerify="true">
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="example.com"
android:pathPrefix="/profile" />
</intent-filter>
Атрибут autoVerify указывает системе проверить Digital Asset Links при установке приложения. Если верификация проходит успешно, приложение автоматически становится обработчиком по умолчанию для указанного домена и путей.
После того как система выбрала компонент для обработки Intent, разработчик должен извлечь данные из входящего намерения внутри целевого компонента. Для Activity используется метод getIntent() в onCreate(), для BroadcastReceiver — метод onReceive(), где Intent передаётся как параметр.
Извлечение данных включает получение action для определения типа операции, data для URI и extra-параметров для дополнительной информации. Каждый из этих элементов может отсутствовать, поэтому обязательна проверка на null перед использованием.
Пример обработки входящего deep link в Activity на Kotlin. Код извлекает URI из Intent и на основе хоста и пути принимает решение о навигации.
class ProfileActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val uri = intent?.data
if (uri?.host == "profile") {
val userId = uri.lastPathSegment
loadProfile(userId)
}
}
}
Рекомендуется использовать safe call operator для проверки intent и data на null, так как активность может быть запущена без входящего deep link. Также стоит проверять host и pathSegment на null перед их использованием в навигации.
Если несколько приложений зарегистрировали Intent Filter, подходящий под один и тот же неявный Intent, система показывает пользователю диалог выбора. Пользователь может выбрать приложение для однократного использования или установить обработчик по умолчанию. Начиная с Android 10, диалог выбора показывается только при первом вызове, после чего система запоминает выбор пользователя.
Для управления приоритетом используется атрибут android:priority в теге intent-filter. Чем выше значение, тем больший приоритет имеет компонент при разрешении конфликтов. Однако приоритет не работает для фильтров из разных приложений — в этом случае всегда показывается диалог выбора, если ни одно приложение не установлено по умолчанию.
Разработчик может программно вызвать диалог выбора через Intent.createChooser(), передав целевой Intent и заголовок. Это полезно, когда приложение хочет явно предложить пользователю выбрать обработчик, даже если установлено приложение по умолчанию. Например, при отправке изображений в соцсети через ACTION_SEND with createChooser гарантирует показ диалога независимо от настроек по умолчанию.
Одна из самых частых ошибок — отсутствие категории DEFAULT в Intent Filter. Разработчики копируют конфигурацию из примеров, но забывают добавить эту категорию, в результате Activity не получает неявные Intent. Система просто не видит фильтр для неявных вызовов, хотя явные Intent продолжают работать.
Вторая распространённая ошибка — некорректное указание scheme в теге data без полного URI. Если указана только схема, но не указан host, фильтр будет принимать все ссылки с этой схемой от любого источника, что может привести к нежелательным вызовам из непроверенных источников. Рекомендуется всегда указывать как минимум scheme и host.
Третья ошибка — отсутствие проверки intent.data на null в коде Activity. Если Activity запускается не через deep link, а стандартным способом из лаунчера, Intent не содержит URI. Обращение к intent.data без проверки вызывает NullPointerException и краш приложения. Всегда используйте intent?.data?.toString() с safe call оператором.
Часто задаваемые вопросы
Да, для получения неявных Intent категория DEFAULT обязательна. Без неё система не будет передавать компоненту неявные вызовы, и Intent Filter будет работать только для явных Intent, которые и так не проверяют фильтры.
Ограничений нет. Одна Activity может содержать любое количество Intent Filter. Каждый фильтр описывает отдельный сценарий обработки, например один фильтр для deep link, другой для обработки файлов, третий для Share Sheet.
Intent Filter — это общий механизм для обработки неявных Intent. App Link — это частный случай Intent Filter с верификацией через Digital Asset Links, который автоматически назначает приложение обработчиком по умолчанию для HTTPS-ссылок на указанном домене.
Да, Intent Filter можно объявлять не только для Activity, но и для Service и BroadcastReceiver. Для Service это позволяет запускать фоновую службу из других приложений, для BroadcastReceiver — получать системные широковещательные сообщения.
MIME-тип указывается в теге data через атрибуты mimeType. Фильтр определяет, какие типы данных компонент может обрабатывать — например, image/* для всех изображений или text/plain только для простого текста. MIME-типы могут комбинироваться с URI-схемами.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также