Как работают Intent и URI‑схемы intent:// в Android

Intent — это объект для запуска Activity/Service/BroadcastReceiver и передачи данных между приложениями; intent:// — специальная URI‑схема, которая браузером или системой преобразуется в Intent и может открыть приложение с fallback на веб или магазин, если приложения нет.

Что такое Intent и зачем он нужен

Intent — универсальный способ запросить действие в Android: открыть экран, запустить сервис или отправить вещание. Бывают два типа:

  • Явный Intent: указывает конкретный класс (new Intent(this, MyActivity.class)) — для внутренних переходов.
  • Неявный Intent: указывает action, data, category — система выбирает подходящее приложение (например, ACTION_VIEW для URL или ACTION_SEND для шаринга).

Ключевые преимущества: слабая связность между компонентами, возможность переиспользования системных и сторонних приложений, передача данных через extras.

Ключевые поля Intent

ПолеОписаниеПример
actionДействие, которое нужно выполнитьACTION_VIEW
dataURI или данные для обработкиUri.parse("https://example.com")
typeMIME‑тип данных"image/jpeg"
extrasДоп. параметры (ключ‑значение)intent.putExtra("id", 123)
categoryКатегории контекстаBROWSABLE, DEFAULT
componentЯвная привязка к классуnew ComponentName(pkg, cls)
flagsФлаги поведения запускаFLAG_ACTIVITY_NEW_TASK

Пример простого вызова:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:37.7749,-122.4194"));
startActivity(intent);

URI‑схемы и intent:// — синтаксис и поведение

Ссылки вида intent:// — это спецификация Intent URI. Браузер парсит строку, собирает Intent и пробует открыть приложение, соответствующее intent‑filter в манифесте. Общая структура: intent://#Intent;scheme=;package=;S.browser_fallback_url=;end

Пример (для QR‑сканера): intent://scan/#Intent;scheme=scanapp;package=com.example.scanner;S.browser_fallback_url=https://example.com/fallback;end

Поведение при клике:

  1. Браузер преобразует строку в Intent.
  2. Система ищет приложение с подходящим (по scheme/host/action и категориям DEFAULT и BROWSABLE).
  3. Если найдено — открывает приложение напрямую (может пропускаться диалог выбора, если верифицирован).
  4. Если не найдено — выполняется fallback: открытие S.browser_fallback_url или переход на страницу приложения в магазине (если указан пакет).

Пример intent‑filter в AndroidManifest.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" />
</intent-filter>

Если хотите, чтобы браузер открывал приложение без диалога, используйте цифровую верификацию домена (app links / autoVerify) и корректные intent‑filters.

Практическая настройка: intent‑filter, fallback и тестирование

  1. Опишите intent‑filter в манифесте: action VIEW, категории DEFAULT и BROWSABLE, data с нужной scheme/host/path.
  2. Добавьте безопасный fallback: параметр S.browser_fallback_url в intent‑URI или на сервере отдавайте обычный HTTPS‑ссылка.
  3. Реализуйте обработку extras в Activity: getIntent().getStringExtra("key").
  4. Тестирование:
    • На устройстве/эмуляторе кликайте ссылку в браузере.
    • Через ADB: adb shell am start -a android.intent.action.VIEW -d "intent://details?id=123#Intent;scheme=example;package=com.example;end"
    • Проверяйте поведение, когда приложение установлено и когда нет (fallback).

Не полагайтесь только на intent://: часть пользователей не установит приложение. Всегда обеспечьте корректный веб‑fallback.

Частые ошибки

  • Отсутствуют категории DEFAULT или BROWSABLE в intent‑filter — ссылка игнорируется.
  • Неправильно указан scheme/host или path — приложение не будет сопоставлено.
  • Нет проверки и обработки null для extras — падения при чтении данных.
  • Отсутствует fallback — пользователь останется в пустом браузере.

FAQ

  • Нужно ли указывать package в intent://?
    Указывать package гарантирует вызов конкретного приложения, но ухудшает совместимость; без package система выберет любой подходящий обработчик.

  • Можно ли передать сложные объекты через intent://?
    Через URI удобно передавать строковые параметры (S.=). Для сложных данных используйте app‑level синхронизацию или deep link с id, который приложение достанет с сервера.

  • Как обеспечить безопасность?
    Проверяйте входные параметры, валидируйте данные, используйте верификацию домена для app links и не доверяйте данным из внешних источников.

Читайте и применяйте: корректно настроенный Intent + intent:// с fallback повышают конверсию перехода из браузера в приложение и делают UX предсказуемым.