Создавайте глубокие ссылки на контент приложения

Когда щелкнутая ссылка или программный запрос вызывает намерение веб-URI, система Android пытается выполнить каждое из следующих действий в последовательном порядке, пока запрос не будет успешным:

  1. Откройте предпочитаемое пользователем приложение, которое может обрабатывать URI, если оно указано.
  2. Откройте единственное доступное приложение, которое может обрабатывать URI.
  3. Разрешить пользователю выбирать приложение из диалогового окна.

Следуйте инструкциям ниже, чтобы создать и протестировать ссылки на ваш контент. Вы также можете использовать Помощник по ссылкам на приложения в Android Studio, чтобы добавлять ссылки на приложения Android.

Примечание. Начиная с Android 12 (уровень API 31), общее веб-намерение преобразуется в действие в вашем приложении только в том случае, если ваше приложение одобрено для определенного домена, содержащегося в этом веб-намерении. Если ваше приложение не одобрено для домена, вместо этого веб-намерение разрешается в браузерное приложение пользователя по умолчанию.

Добавьте фильтры намерений для входящих ссылок.

Чтобы создать ссылку на контент вашего приложения, добавьте в манифест фильтр намерений, содержащий эти элементы и значения атрибутов:

<action>
Укажите действие намерения ACTION_VIEW , чтобы фильтр намерений был доступен из поиска Google.
<data>
Добавьте один или несколько тегов <data> , каждый из которых представляет формат URI, соответствующий действию. Как минимум, тег <data> должен включать атрибут android:scheme .

Вы можете добавить дополнительные атрибуты, чтобы уточнить тип URI, который принимает действие. Например, у вас может быть несколько действий, которые принимают схожие URI, но различаются просто по имени пути. В этом случае используйте атрибут android:path или его варианты pathPattern или pathPrefix , чтобы различать, какое действие система должна открывать для разных путей URI.

<category>
Включите категорию BROWSABLE . Это необходимо для того, чтобы фильтр намерений был доступен из веб-браузера. Без него щелчок по ссылке в браузере не сможет привести к вашему приложению.

Также включите категорию DEFAULT . Это позволяет вашему приложению реагировать на неявные намерения. Без этого действие можно запустить только в том случае, если в намерении указано имя компонента вашего приложения.

В следующем фрагменте XML показано, как можно указать фильтр намерений в манифесте для глубоких ссылок. Оба URI “example://gizmos” и “http://www.example.com/gizmos” относятся к этому действию.

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
        <!-- note that the leading "/" is required for pathPrefix-->
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "example://gizmos” -->
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

Обратите внимание, что два фильтра намерений отличаются только элементом <data> . Хотя в один фильтр можно включить несколько элементов <data> , важно создать отдельные фильтры, если вы намерены объявить уникальные URL-адреса (например, определенную комбинацию scheme и host ), поскольку несколько элементов <data> в одни и те же фильтры намерений фактически объединяются для учета всех вариантов их объединенных атрибутов. Например, рассмотрим следующее:

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

Может показаться, что это поддерживает только https://www.example.com и app://open.my.app . Однако на самом деле он поддерживает эти два, а также app://www.example.com и https://open.my.app .

Внимание: если несколько действий содержат фильтры намерений, которые разрешают одну и ту же проверенную ссылку на приложение Android, нет никакой гарантии, какое действие обрабатывает ссылку.

После того как вы добавили фильтры намерений с URI для содержимого активности в манифест вашего приложения, Android сможет направить любое Intent , имеющее соответствующие URI, в ваше приложение во время выполнения.

Дополнительные сведения об определении фильтров намерений см. в разделе «Разрешить другим приложениям начинать вашу активность» .

Чтение данных из входящих намерений

Как только система начнет вашу деятельность через фильтр намерений, вы можете использовать данные, предоставленные Intent , чтобы определить, что вам нужно отобразить. Вызовите методы getData() и getAction() чтобы получить данные и действие, связанные с входящим Intent . Вы можете вызывать эти методы в любой момент жизненного цикла активности, но обычно это следует делать во время ранних обратных вызовов, таких как onCreate() или onStart() .

Вот фрагмент, показывающий, как получить данные из Intent :

Котлин

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val action: String? = intent?.action
    val data: Uri? = intent?.data
}

Ява

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}

Следуйте этим рекомендациям, чтобы улучшить взаимодействие с пользователем:

  • Глубокая ссылка должна направлять пользователей непосредственно к контенту без каких-либо подсказок, промежуточных страниц или входов в систему. Убедитесь, что пользователи могут видеть содержимое приложения, даже если они никогда ранее не открывали его. Можно предлагать пользователям подсказывать при последующих взаимодействиях или при открытии приложения из панели запуска.
  • Следуйте рекомендациям по проектированию, описанным в разделе «Навигация с помощью кнопок «Назад» и «Вверх» , чтобы ваше приложение соответствовало ожиданиям пользователей в отношении обратной навигации после того, как они войдут в ваше приложение по глубокой ссылке.

Проверьте свои глубокие ссылки

Вы можете использовать Android Debug Bridge с инструментом диспетчера действий (am), чтобы проверить, что URI фильтра намерений, указанные вами для глубокой связи, соответствуют правильной активности приложения. Вы можете запустить команду adb для устройства или эмулятора.

Общий синтаксис для тестирования URI фильтра намерений с помощью adb:

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>

Например, команда ниже пытается просмотреть действие целевого приложения, связанное с указанным URI.

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d "example://gizmos" com.example.android

Установленное выше объявление манифеста и обработчик намерений определяют соединение между вашим приложением и веб-сайтом и то, что делать с входящими ссылками. Однако, чтобы система рассматривала ваше приложение как обработчик по умолчанию для набора URI, вам также необходимо запросить у системы проверку этого соединения. Следующий урок объясняет, как реализовать эту проверку.

Чтобы узнать больше о намерениях и ссылках на приложения, посетите следующие ресурсы: