Как работают Deep Link под капотом
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работают Deep Link на Android: внутренний механизм
Под капотом Deep Link на Android — это сложная система взаимодействия между системой Android, браузером (или другим приложением-отправителем) и вашим приложением-получателем. Весь процесс можно разделить на несколько ключевых этапов.
1. Декларация Intent Filter в манифесте
Ядро механизма — объявление Intent Filter в AndroidManifest.xml. Именно здесь приложение сообщает системе, на какие "ссылки" (точнее, Intent'ы) оно готово реагировать. Самый распространённый тип — VIEW action с категориями BROWSABLE и DEFAULT.
<activity android:name=".ProductDetailActivity">
<intent-filter>
<!-- Основное действие — просмотр -->
<action android:name="android.intent.action.VIEW" />
<!-- Позволяет открываться из браузера -->
<category android:name="android.intent.category.BROWSABLE" />
<!-- Обязательная категория для неявных Intent -->
<category android:name="android.intent.category.DEFAULT" />
<!-- Схема (протокол) -->
<data android:scheme="https" />
<!-- Домен -->
<data android:host="myapp.example.com" />
<!-- Префикс пути (опционально) -->
<data android:pathPrefix="/products/" />
</intent-filter>
</activity>
2. Инициация Intent'а (Запускающая сторона)
Когда пользователь кликает на ссылку (например, в браузере, письме или другом приложении), система создает неявный Intent с данными этой ссылки. Для HTTP/HTTPS ссылок это обычно происходит через Chrome Custom Tabs или Android App Links (на Android 6.0+).
// Пример Intent, который создаёт система при клике на https://myapp.example.com/products/123
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://myapp.example.com/products/123"))
intent.addCategory(Intent.CATEGORY_BROWSABLE)
intent.addCategory(Intent.CATEGORY_DEFAULT)
3. Разрешение Intent'а (Resolving) — "Под капотом" системы
Это самый важный этап, который выполняет Activity Manager Service (AMS):
- Сбор кандидатов: Система сканирует все установленные приложения и их
AndroidManifest.xml, ища все<intent-filter>, которые потенциально соответствуют данному Intent. - Проверка совпадения: Каждый фильтр проверяется по всем параметрам
data:scheme,host,port,path,pathPrefix,pathPattern. Совпадение должно быть точным. - Дисплей диалога выбора: Если находится несколько приложений, способных обработать Intent, система показывает пользователю диалог выбора ("Открыть с помощью...") с возможностью запомнить выбор. Если приложение одно — оно запускается сразу.
- Особый случай — Android App Links (верифицированные ссылки): Для HTTPS-ссылок с вашим доменом система перед показом диалога проверяет наличие цифровой связи между приложением и сайтом через Digital Asset Links JSON, размещённый по адресу
https://domain/.well-known/assetlinks.json. Если связь подтверждена, система автоматически открывает ваше приложение без диалога выбора, передавая ему Intent.
4. Обработка в целевом приложении
Когда система выбрала ваше приложение, она запускает объявленную Activity (например, ProductDetailActivity):
class ProductDetailActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_product_detail)
// Извлечение данных из Intent
val data: Uri? = intent?.data
data?.let { uri ->
// Парсинг URI: https://myapp.example.com/products/123
val pathSegments = uri.pathSegments // ["products", "123"]
val productId = pathSegments.lastOrNull() // "123"
// Загрузка данных по productId и отображение
viewModel.loadProduct(productId)
}
}
}
Ключевые компоненты системы
- PackageManager: Системный сервис, который знает обо всех установленных приложениях и их компонентах (из манифестов). Именно его запрашивает AMS для получения списка потенциальных
Activity, способных обработать Intent. - Activity Manager Service (AMS): Главный диспетчер, который управляет жизненным циклом компонентов и разрешением Intent'ов.
- Content Provider (для App Links): На устройстве есть специальный системный провайдер
com.android.providers.verifiedlinks, который кэширует результаты верификации Digital Asset Links для быстрого доступа.
Поток данных при клике на App Link
- Клик на
https://myapp.example.com/products/123. - Система создает Intent(ACTION_VIEW) с этим URI.
- AMS запрашивает у PackageManager все
Activityс подходящими<intent-filter>. - AMS проверяет, есть ли для домена
myapp.example.comверифицированная связь с приложением (через кэш или онлайн-проверкуassetlinks.json). - Если связь подтверждена: Intent автоматически передается в вашу
ProductDetailActivity. - Если нет: Пользователю показывается диалог выбора приложения (браузер или ваше приложение, если оно есть в списке кандидатов).
- Ваша
ActivityизвлекаетproductIdизintent.dataи отображает соответствующий контент.
Понимание этой внутренней кухни критически важно для отладки сложных случаев (конфликты ссылок, проблемы с верификацией App Links) и проектирования корректной и безопасной deep link -навигации в приложении.