В чем разница явных и неявных Intent в Android
Что проверяют
Понимаете ли вы, как система находит получателя Intent и что меняется, когда адресат не указан. Следом часто спрашивают про intent-filter, <queries> и про то, почему своим внутренним компонентам неявный Intent не шлют.
Как отвечать
- явный Intent: указан конкретный компонент, через класс
Intent(context, DetailsActivity::class.java)илиComponentName. Система не ищет получателя, а сразу запускает его. Так ходят внутри приложения, запускают свойServiceи адресно шлют broadcast; - неявный Intent: описано намерение, а не адресат: action, data (URI и MIME-тип), category. Например,
ACTION_VIEWс URI для открытия ссылки илиACTION_SENDдля «Поделиться». Система сверяет его с<intent-filter>установленных приложений, при нескольких вариантах показывает выбор, аIntent.createChooserделает выбор обязательным.
Дальше покажите, что знаете ограничения платформы:
- Android 5.0:
bindServiceс неявным Intent бросает исключение, сервисы запускают только явно; - Android 11: видимость пакетов, без
<queries>в манифестеresolveActivityвернётnull, даже если нужное приложение стоит. Надёжнее вызватьstartActivityи пойматьActivityNotFoundException; - Android 12: компонент с
<intent-filter>обязан явно объявитьandroid:exported; - Android 14: неявный Intent доставляется только экспортированным компонентам, к своим закрытым обращаются явно.
Чтобы Activity принимала неявные Intent из startActivity, в её фильтре нужна категория android.intent.category.DEFAULT.
Где спотыкаются
Говорят, что фильтры в манифесте нужны отправителю неявного Intent. Фильтры объявляет получатель, отправитель только формулирует намерение.
Не обрабатывают случай, когда подходящего приложения нет. На устройстве без почтового клиента startActivity с ACTION_SENDTO падает с ActivityNotFoundException.
Шлют неявный Intent там, где адресат известен, например внутренний broadcast с чувствительными данными. Его перехватит чужое приложение с таким же фильтром, поэтому для своих компонентов нужен явный Intent или хотя бы setPackage.