Intent Filter: что это, как работает и используется в разработке

Автор: IT Sectr Опубликовано: 2026-05-14 Время чтения: 8 мин

Intent Filter — это декларативное объявление в AndroidManifest.xml, которое указывает системе, какие неявные намерения способен обрабатывать компонент приложения. По данным Android Developer Guide, фильтр содержит action, category и data, на основе которых система маршрутизирует вызовы от других приложений и системных событий. Android-разработка использует Intent Filter как основной механизм слабой связности между компонентами разных приложений.

Главное

  • Intent Filter — XML-декларация в манифесте, определяющая типы неявных Intent, которые может обрабатывать Activity, Service или BroadcastReceiver.
  • Action указывает действие, которое должен выполнить компонент — например, ACTION_VIEW для просмотра данных или ACTION_SEND для отправки контента.
  • Category задаёт дополнительную категорию компонента — BROWSABLE разрешает вызов из браузера, DEFAULT требуется для неявных Intent.
  • Data описывает URI, MIME-тип или схему обрабатываемых данных, что критически важно для настройки deep link в приложении.
  • Конфликты при наличии нескольких приложений, обрабатывающих один Intent, разрешаются системным диалогом выбора или настройками по умолчанию.

Что такое Intent Filter?

Intent Filter — это элемент конфигурации Android-приложения, который сообщает системе о возможности компонента обрабатывать определённые типы неявных намерений. В отличие от явных Intent, указывающих конкретный класс, неявные Intent содержат только описание требуемого действия, а система сама находит подходящий компонент на основе зарегистрированных фильтров.

Фильтры объявляются внутри компонента — Activity, Service или BroadcastReceiver — в файле AndroidManifest.xml. Каждый фильтр может содержать несколько элементов action, category и data. Компонент может иметь неограниченное количество Intent Filter, каждый из которых описывает отдельный сценарий обработки.

Роль в архитектуре Android

Intent Filter реализует принцип слабой связанности между компонентами приложений. Приложение A не обязано знать о существовании приложения B — оно просто отправляет Intent с описанием действия, а система маршрутизирует его на основе фильтров. Этот механизм лежит в основе Share Sheet, выбора браузера и обработки deep link.

Типы Intent: явные и неявные

Явные Intent указывают конкретный класс компонента для запуска. Они используются для внутренней навигации внутри одного приложения, когда разработчик точно знает, какая Activity должна открыться. Неявные Intent содержат только описание действия, а компонент определяется системой динамически.

Intent Filter работает исключительно с неявными Intent. Если в Intent указан конкретный класс, система игнорирует все фильтры и запускает указанный компонент напрямую. Фильтры проверяются только при разрешении неявных вызовов, что делает их ключевым элементом межприкладного взаимодействия.

Сравнение явных и неявных Intent

ХарактеристикаЯвный IntentНеявный Intent
КомпонентУказан явно (className)Определяется системой
Intent FilterНе требуетсяОбязателен
ПримерstartActivity(Intent(this, ProfileActivity::class.java))Intent(ACTION_VIEW, Uri.parse("https://example.com"))
БезопасностьВыше (нет перехвата)Ниже (возможны конфликты)

Структура Intent Filter в манифесте

Каждый Intent Filter состоит из трёх групп элементов — action, category и data — комбинация которых определяет, какие Intent будет получать компонент. Фильтр считается пройденным, если Intent соответствует хотя бы одному элементу каждой группы.

Action описывает выполняемое действие — просмотр, редактирование, отправку. Category добавляет дополнительный контекст обработки — например, возможность запуска из браузера. Data определяет формат обрабатываемой информации через URI или MIME-тип.

Компоненты тега intent-filter

Пример Intent Filter для Activity, открывающей ссылки на профили пользователей. Фильтр включает все три группы элементов для точной маршрутизации.

xml
<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. После верификации система автоматически открывает приложение без диалога выбора.

Data-тег для URL

Пример фильтра для App Link с верификацией через HTTPS-ссылку. В этом случае схема всегда https, а хост соответствует домену, указанному в Digital Asset Links.

xml
<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 в компонентах приложения

После того как система выбрала компонент для обработки Intent, разработчик должен извлечь данные из входящего намерения внутри целевого компонента. Для Activity используется метод getIntent() в onCreate(), для BroadcastReceiver — метод onReceive(), где Intent передаётся как параметр.

Извлечение данных включает получение action для определения типа операции, data для URI и extra-параметров для дополнительной информации. Каждый из этих элементов может отсутствовать, поэтому обязательна проверка на null перед использованием.

Код обработки в Activity

Пример обработки входящего deep link в Activity на Kotlin. Код извлекает URI из Intent и на основе хоста и пути принимает решение о навигации.

kotlin
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 гарантирует показ диалога независимо от настроек по умолчанию.

Типичные ошибки при настройке Intent Filter

Одна из самых частых ошибок — отсутствие категории 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 оператором.

Часто задаваемые вопросы

Обязательно ли указывать category DEFAULT в Intent Filter?

Да, для получения неявных Intent категория DEFAULT обязательна. Без неё система не будет передавать компоненту неявные вызовы, и Intent Filter будет работать только для явных Intent, которые и так не проверяют фильтры.

Сколько Intent Filter может быть у одной Activity?

Ограничений нет. Одна Activity может содержать любое количество Intent Filter. Каждый фильтр описывает отдельный сценарий обработки, например один фильтр для deep link, другой для обработки файлов, третий для Share Sheet.

Чем Intent Filter отличается от App Link?

Intent Filter — это общий механизм для обработки неявных Intent. App Link — это частный случай Intent Filter с верификацией через Digital Asset Links, который автоматически назначает приложение обработчиком по умолчанию для HTTPS-ссылок на указанном домене.

Можно ли использовать Intent Filter для Service или BroadcastReceiver?

Да, Intent Filter можно объявлять не только для Activity, но и для Service и BroadcastReceiver. Для Service это позволяет запускать фоновую службу из других приложений, для BroadcastReceiver — получать системные широковещательные сообщения.

Как Intent Filter обрабатывает MIME-типы?

MIME-тип указывается в теге data через атрибуты mimeType. Фильтр определяет, какие типы данных компонент может обрабатывать — например, image/* для всех изображений или text/plain только для простого текста. MIME-типы могут комбинироваться с URI-схемами.

Итоги

  • Intent Filter — XML-декларация в AndroidManifest.xml, определяющая какие неявные Intent может обрабатывать компонент приложения.
  • Три группы — action (действие), category (категория), data (URI и MIME) составляют фильтр; компонент получает Intent, если совпадают все указанные группы.
  • Deep link настраивается через action VIEW и тег data со схемой, хостом и путём, опционально с autoVerify для App Links.
  • App Links — верифицированные HTTPS-ссылки через Digital Asset Links, не требующие диалога выбора приложения.
  • Конфликты при совпадении нескольких фильтров решаются системным диалогом или приоритетом для компонентов одного приложения.
  • Обработка входящего Intent выполняется через intent.data в Activity или onReceive в BroadcastReceiver с обязательной проверкой на null.
  • Применение — Intent Filter используется для межприкладного взаимодействия, обработки ссылок, файлов и системных событий.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также