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 з createChooser гарантує показ діалогу незалежно від налаштувань за замовчуванням.
Одна з найчастіших помилок — відсутність категорії 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 оператором.
Часті запитання
Так, для отримання неявних 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також