В 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>
Вы также можете использовать Редактор навигации для создания неявной глубокой ссылки на пункт назначения следующим образом:
- На вкладке «Дизайн» редактора навигации выберите место назначения для глубокой ссылки.
- Нажмите + в разделе «Ссылки на контент» на панели «Атрибуты» .
В появившемся диалоговом окне «Добавить глубокую ссылку» введите информацию для своей глубокой ссылки.
Обратите внимание на следующее:
- 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.
- URI без схемы считаются http или https. Например,
(необязательно) Установите флажок «Автоматическая проверка» , чтобы потребовать от Google подтверждения того, что вы являетесь владельцем URI. Дополнительную информацию см. в разделе «Проверка ссылок на приложения Android» .
Нажмите Добавить . Значок ссылки появляется над выбранным пунктом назначения, указывая на то, что пункт назначения имеет глубокую ссылку.
Перейдите на вкладку «Код» , чтобы переключиться на представление 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); }
Дополнительные ресурсы
Чтобы узнать больше о навигации, посетите следующие ресурсы.