Что такое intent filters в Android
Что проверяют
Понимаете ли вы, как система выбирает компонент для неявного интента и что фильтр это ещё и публичная точка входа в приложение. Следом обычно спрашивают про android:exported, про deep links или про то, почему активность с фильтром не открывается через startActivity.
Как отвечать
Intent filter объявляет, какие неявные интенты готов принять компонент: активность, сервис или ресивер. Явный интент с указанным классом фильтры не проверяет вовсе. Совпадение ищется по трём тестам:
- action: интент должен совпасть хотя бы с одним
<action>фильтра, напримерACTION_VIEWилиACTION_SEND; - category: каждая категория интента должна быть в фильтре.
startActivityсам добавляет к неявному интентуCATEGORY_DEFAULT, поэтому без этой категории в фильтре активность такой интент не получит; - data: схема, хост, путь и MIME-тип. На них держатся deep links и приём файлов вроде
image/*.
Типовые случаи: MAIN вместе с LAUNCHER для иконки в лаунчере, ACTION_SEND для пункта в меню «Поделиться», VIEW с BROWSABLE и схемой https для ссылок. App Links добавляют android:autoVerify="true" и файл assetlinks.json на домене, тогда система открывает приложение без диалога выбора.
Ресиверу фильтр можно задать и в коде, через IntentFilter при registerReceiver. Сервисы неявными интентами не запускаются с Android 5.0, туда нужен явный.
Добавьте про безопасность: с Android 12 компонент с фильтром обязан явно указать android:exported, а с Android 13 внешние интенты, не совпавшие ни с одним объявленным фильтром, до экспортированного компонента не доходят.
Где спотыкаются
Забывают CATEGORY_DEFAULT и не понимают, почему активность объявлена в манифесте, а startActivity падает с ActivityNotFoundException.
Считают фильтр защитой. На деле это приглашение: любое приложение может отправить интент в экспортированный компонент, поэтому данные из Intent проверяют так же строго, как запрос из сети.
Не знают про видимость пакетов с Android 11: без блока <queries> в манифесте resolveActivity и queryIntentActivities не видят чужие приложения, хотя сам startActivity сработает.