Как работают 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 |
| data | URI или данные для обработки | Uri.parse("https://example.com") |
| type | MIME‑тип данных | "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://
Пример (для QR‑сканера): intent://scan/#Intent;scheme=scanapp;package=com.example.scanner;S.browser_fallback_url=https://example.com/fallback;end
Поведение при клике:
- Браузер преобразует строку в Intent.
- Система ищет приложение с подходящим
(по scheme/host/action и категориям DEFAULT и BROWSABLE). - Если найдено — открывает приложение напрямую (может пропускаться диалог выбора, если верифицирован).
- Если не найдено — выполняется 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 и тестирование
- Опишите intent‑filter в манифесте: action VIEW, категории DEFAULT и BROWSABLE, data с нужной scheme/host/path.
- Добавьте безопасный fallback: параметр S.browser_fallback_url в intent‑URI или на сервере отдавайте обычный HTTPS‑ссылка.
- Реализуйте обработку extras в Activity: getIntent().getStringExtra("key").
- Тестирование:
- На устройстве/эмуляторе кликайте ссылку в браузере.
- Через 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 предсказуемым.