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 реализира принципа на слабата свързаност между компоненти на приложения. Приложение А не е задължено да знае за съществуването на приложение Б — то просто изпраща 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, съдържащ схема, host и път. При преминаване към връзка от вида 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, а host съответства на домейна, посочен в 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 и въз основа на host и пътя взема решение за навигация.

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 оператор за проверка на 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. Ако е посочена само схемата, но не и 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 със схема, host и път, опционално с autoVerify за App Links.
  • App Links — удостоверени HTTPS връзки чрез Digital Asset Links, които не изискват диалог за избор на приложение.
  • Конфликти при съвпадение на няколко филтъра се разрешават чрез системен диалог или приоритет за компоненти на едно приложение.
  • Обработка на входящ Intent се извършва чрез intent.data в Activity или onReceive в BroadcastReceiver със задължителна проверка за null.
  • Приложение — Intent Filter се използва за междуприложно взаимодействие, обработка на връзки, файлове и системни събития.

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

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също