Когда нажатая ссылка или программный запрос вызывает намерение веб-URI, система Android пытается выполнить каждое из следующих действий в последовательном порядке, пока запрос не будет успешно выполнен:
- Откройте предпочитаемое пользователем приложение, которое может обрабатывать URI, если таковое указано.
- Откройте единственное доступное приложение, которое может обрабатывать URI.
- Разрешить пользователю выбирать приложение из диалогового окна.
Следуйте инструкциям ниже, чтобы создать и протестировать ссылки на ваш контент. Вы также можете использовать App Links Assistant в 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(); }
Чтобы улучшить пользовательский опыт, следуйте этим рекомендациям:
- Глубокая ссылка должна перенаправлять пользователей непосредственно к контенту, без каких-либо подсказок, промежуточных страниц или логинов. Убедитесь, что пользователи могут видеть контент приложения, даже если они никогда ранее не открывали приложение. Можно подсказывать пользователям при последующих взаимодействиях или при открытии приложения из Launcher.
- Следуйте рекомендациям по проектированию, описанным в разделе «Навигация с помощью кнопок «Назад» и «Вверх» , чтобы ваше приложение соответствовало ожиданиям пользователей относительно обратной навигации после того, как они перешли в ваше приложение по глубокой ссылке.
Проверьте свои глубокие ссылки
Вы можете использовать Android Debug Bridge с инструментом activity manager (am), чтобы проверить, что URI фильтра намерений, которые вы указали для deep linking, разрешают правильную активность приложения. Вы можете запустить команду 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, вы также должны запросить у системы проверку этого соединения. В следующем уроке объясняется, как реализовать эту проверку.
Чтобы узнать больше о намерениях и ссылках приложений, посетите следующие ресурсы:
- Намерения и фильтры намерений
- Разрешить другим приложениям запускать вашу активность
- Добавьте ссылки на приложения Android с помощью Android Studio