← Назад к вопросам

Как работают Deep Link под капотом

1.7 Middle🔥 172 комментариев
#Android компоненты#Жизненный цикл и навигация

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работают 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

  1. Клик на https://myapp.example.com/products/123.
  2. Система создает Intent(ACTION_VIEW) с этим URI.
  3. AMS запрашивает у PackageManager все Activity с подходящими <intent-filter>.
  4. AMS проверяет, есть ли для домена myapp.example.com верифицированная связь с приложением (через кэш или онлайн-проверку assetlinks.json).
  5. Если связь подтверждена: Intent автоматически передается в вашу ProductDetailActivity.
  6. Если нет: Пользователю показывается диалог выбора приложения (браузер или ваше приложение, если оно есть в списке кандидатов).
  7. Ваша Activity извлекает productId из intent.data и отображает соответствующий контент.

Понимание этой внутренней кухни критически важно для отладки сложных случаев (конфликты ссылок, проблемы с верификацией App Links) и проектирования корректной и безопасной deep link -навигации в приложении.