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