Создайте глубокую ссылку для места назначения

В Android глубокая ссылка — это ссылка, которая ведет прямо к определенному месту назначения в приложении.

Компонент «Навигация» позволяет создавать два разных типа глубоких ссылок: явные и неявные .

Создайте явную глубокую ссылку

Явная глубокая ссылка — это отдельный экземпляр глубокой ссылки, который использует PendingIntent для направления пользователей в определенное место в вашем приложении. Например, вы можете разместить явную глубокую ссылку как часть уведомления или виджета приложения.

Когда пользователь открывает ваше приложение по явной ссылке на контент, стек задач очищается и заменяется местом назначения ссылки на контент. При вложении графов в стек также добавляется начальный пункт назначения каждого уровня вложенности, то есть начальный пункт назначения каждого элемента <navigation> в иерархии. Это означает, что когда пользователь нажимает кнопку «Назад» из места назначения глубокой ссылки, он возвращается обратно вверх по стеку навигации, как если бы он вошел в ваше приложение из его точки входа.

Вы можете использовать класс NavDeepLinkBuilder для создания PendingIntent , как показано в примере ниже. Обратите внимание: если предоставленный контекст не является Activity , конструктор использует PackageManager.getLaunchIntentForPackage() в качестве действия по умолчанию для запуска, если оно доступно.

Котлин

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .createPendingIntent()

Ява

PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .createPendingIntent();

По умолчанию NavDeepLinkBuilder запускает вашу явную глубокую ссылку в Activity запуска по умолчанию, объявленное в манифесте вашего приложения. Если ваш NavHost находится в другом действии, вы должны указать имя его компонента при создании построителя глубоких ссылок:

Котлин

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .setComponentName(DestinationActivity::class.java)
    .createPendingIntent()

Ява

PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
        .setGraph(R.navigation.nav_graph)
        .setDestination(R.id.android)
        .setArguments(args)
        .setComponentName(DestinationActivity.class)
        .createPendingIntent();

Если у вас есть ComponentName , вы можете передать его непосредственно сборщику:

Котлин

val componentName = ...

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .setComponentName(componentName)
    .createPendingIntent()

Ява

ComponentName componentName = ...;

PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
        .setGraph(R.navigation.nav_graph)
        .setDestination(R.id.android)
        .setArguments(args)
        .setComponentName(componentName)
        .createPendingIntent();

Если у вас есть NavController , вы также можете создать глубокую ссылку с помощью NavController.createDeepLink() .

Создайте неявную глубокую ссылку

Неявная глубокая ссылка относится к определенному месту назначения в приложении. Когда вызывается глубокая ссылка (например, когда пользователь нажимает ссылку), Android может открыть ваше приложение в соответствующем месте назначения.

Глубокие ссылки могут сопоставляться по URI, действиям по намерению и типам MIME. Вы можете указать несколько типов соответствия для одной глубокой ссылки, но учтите, что приоритет имеет сопоставление аргументов URI, затем действие, а затем тип MIME.

Вот пример глубокой ссылки, содержащей URI, действие и тип MIME:

<fragment android:id="@+id/a"
          android:name="com.example.myapplication.FragmentA"
          tools:layout="@layout/a">
        <deepLink app:uri="www.example.com"
                app:action="android.intent.action.MY_ACTION"
                app:mimeType="type/subtype"/>
</fragment>

Вы также можете использовать Редактор навигации для создания неявной глубокой ссылки на пункт назначения следующим образом:

  1. На вкладке «Дизайн» редактора навигации выберите место назначения для глубокой ссылки.
  2. Нажмите + в разделе «Ссылки на контент» на панели «Атрибуты» .
  3. В появившемся диалоговом окне «Добавить глубокую ссылку» введите информацию для своей глубокой ссылки.

    Обратите внимание на следующее:

    • URI без схемы считаются http или https. Например, www.google.com соответствует как http://www.google.com , так и https://www.google.com .
    • Заполнители параметров пути в форме {placeholder_name} соответствуют одному или нескольким символам. Например, http://www.example.com/users/{id} соответствует http://www.example.com/users/4 . Компонент навигации пытается преобразовать значения заполнителей в соответствующие типы, сопоставляя имена заполнителей с определенными аргументами , которые определены для места назначения глубокой ссылки. Если аргумент с таким именем не определен, для значения аргумента используется тип String по умолчанию. Вы можете использовать подстановочный знак .* для сопоставления 0 или более символов.
    • Заполнители параметров запроса можно использовать вместо параметров пути или вместе с ними. Например, http://www.example.com/users/{id}?myarg={myarg} соответствует http://www.example.com/users/4?myarg=28 .
    • Заполнители параметров запроса для переменных, определенных со значениями по умолчанию или значениями, допускающими значение NULL, не обязаны совпадать. Например, http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2} соответствует http://www.example.com/users/4?arg2=28 или http://www.example.com/users/4?arg1=7 . Это не относится к параметрам пути. Например, http://www.example.com/users?arg1=7&arg2=28 не соответствует приведенному выше шаблону, поскольку не указан обязательный параметр пути.
    • Посторонние параметры запроса не влияют на сопоставление URI глубоких ссылок. Например, http://www.example.com/users/{id} соответствует http://www.example.com/users/4?extraneousParam=7 , хотя extraneousParam не определен в шаблоне URI.
  4. (необязательно) Установите флажок «Автоматическая проверка» , чтобы потребовать от Google подтверждения того, что вы являетесь владельцем URI. Дополнительную информацию см. в разделе «Проверка ссылок на приложения Android» .

  5. Нажмите Добавить . Значок ссылки появляется над выбранным пунктом назначения, указывая на то, что пункт назначения имеет глубокую ссылку.

  6. Перейдите на вкладку «Код» , чтобы переключиться на представление XML. В пункт назначения добавлен вложенный элемент <deepLink> :

    <deepLink app:uri="https://www.google.com" />
    

Чтобы включить неявную глубокую ссылку, вам также необходимо внести дополнения в файл manifest.xml вашего приложения.xml. Добавьте в действие один элемент <nav-graph> , который указывает на существующий граф навигации, как показано в следующем примере:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <application ... >

        <activity name=".MainActivity" ...>
            ...

            <nav-graph android:value="@navigation/nav_graph" />

            ...

        </activity>
    </application>
</manifest>

При создании проекта компонент навигации заменяет элемент <nav-graph> сгенерированными элементами <intent-filter> , чтобы они соответствовали всем глубоким ссылкам в графе навигации.

При срабатывании неявной диплинка состояние обратного стека зависит от того, был ли неявный Intent запущен с флагом Intent.FLAG_ACTIVITY_NEW_TASK :

  • Если флаг установлен, обратный стек задачи очищается и заменяется местом назначения глубокой ссылки. Как и в случае явного глубокого связывания , при вложении графов в стек также добавляется начальный пункт назначения каждого уровня вложенности, то есть начальный пункт назначения каждого элемента <navigation> в иерархии. Это означает, что когда пользователь нажимает кнопку «Назад» из места назначения глубокой ссылки, он возвращается обратно вверх по стеку навигации, как если бы он вошел в ваше приложение из его точки входа.
  • Если флаг не установлен, вы остаетесь в стеке задач предыдущего приложения, в котором была активирована неявная глубокая ссылка. В этом случае кнопка «Назад» возвращает вас к предыдущему приложению, а кнопка «Вверх» запускает задачу вашего приложения в иерархическом родительском пункте назначения в вашем графе навигации.

Обработка глубоких ссылок

Настоятельно рекомендуется всегда использовать стандартный launchMode по standard при использовании навигации. При использовании standard режима запуска Navigation автоматически обрабатывает глубокие ссылки, вызывая handleDeepLink() для обработки любых явных или неявных глубоких ссылок в Intent . Однако это не происходит автоматически, если Activity повторно используется при использовании альтернативного launchMode , такого как singleTop . В этом случае необходимо вручную вызвать handleDeepLink() в onNewIntent() , как показано в следующем примере:

Котлин

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    navController.handleDeepLink(intent)
}

Ява

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    navController.handleDeepLink(intent);
}

Дополнительные ресурсы

Чтобы узнать больше о навигации, посетите следующие ресурсы.

Образцы

Кодлабы

Видео