Какие бывают типы интентов в Android: явные и неявные
Что проверяют
Различаете ли вы два типа и знаете ли, что неявный может не найти обработчика.
Как отвечать
Явное намерение указывает конкретный компонент: класс активити или сервиса. Используется внутри своего приложения, потому что вы точно знаете, что запускаете.
startActivity(Intent(this, DetailActivity::class.java))Неявное намерение описывает что нужно сделать, а не кто это сделает: действие, категория, данные с типом. Система сама ищет подходящий компонент по объявленным фильтрам и, если кандидатов несколько, показывает выбор приложения.
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://workaem.com")))Состав намерения: действие, категория, данные с адресом и типом содержимого, дополнения для передачи параметров, флаги, влияющие на стек задач.
Что важно на практике:
- неявное намерение может не найти обработчика, и вызов упадёт с исключением. Обязательно предусматривать этот случай. Отдельная тонкость: начиная с Android 11 проверка наличия обработчика требует объявить в манифесте, какие приложения вас интересуют, иначе система вернёт пустой результат, хотя приложение установлено;
- выбор приложения: если нужно всегда показывать список, а не открывать выбранное пользователем по умолчанию, используется специальная обёртка;
- ограничение размера: дополнения передаются через межпроцессный механизм, буфер которого ограничен примерно мегабайтом на процесс. Большие объекты передавать нельзя, передают идентификатор;
- безопасность: экспортированный компонент с фильтром доступен любому приложению, поэтому данные из намерения нужно проверять как любой внешний ввод. С Android 12 флаг экспорта обязан быть указан явно.
Отдельно стоит упомянуть отложенное намерение: обёртка, позволяющая другому приложению или системе выполнить действие от вашего имени. Используется в уведомлениях, виджетах и будильниках, и требует явного указания изменяемости.
Где спотыкаются
Не обрабатывают отсутствие подходящего приложения.
Передают крупные объекты в дополнениях.
Не объявляют интересующие приложения и получают пустой результат проверки.
Доверяют данным из входящего намерения без проверки.