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 з createChooser гарантує показ діалогу незалежно від налаштувань за замовчуванням.

Типові помилки при налаштуванні Intent Filter

Одна з найчастіших помилок — відсутність категорії DEFAULT в Intent Filter. Розробники копіюють конфігурацію з прикладів, але забувають додати цю категорію, в результаті Activity не отримує неявні Intent. Система просто не бачить фільтр для неявних викликів, хоча явні Intent продовжують працювати.

Друга поширена помилка — некоректне зазначення scheme в тезі data без повного URI. Якщо вказано лише схему, але не вказано хост, фільтр прийматиме всі посилання з цією схемою від будь-якого джерела, що може призвести до небажаних викликів з неперевірених джерел. Рекомендується завжди вказувати як мінімум 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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