Открытие URL-ссылок с помощью Android-приложения (Deep Links)
Что такое Deep Links и как интегрировать их в своё приложение
Как работает открытие ссылок через приложение и зачем оно вообще нужно?
Нередко бывает так, что определённому контенту соответствует и страница на сайте, и экран в приложении. В таких случаях пользователю, у которого установлено приложение, удобно будет открывать ссылку на этот контент через приложение. Как пример можно взять интернет-магазин. Пользователь может нажать на ссылку в браузере, после чего ему предложит просмотреть страницу товара через приложение. Также это хорошо используется с шарингом ссылок. Пример: Петя увидел классные кроссовки на сайте и скинул ссылку на них Васе в Telegram. У Васи уже установлено приложение интернет-магазина, поэтому он нажав на ссылку в Telegram попадает на экран приложения, в котором отображается вся информация об этих замечательных кроссовках. Удобно, не правда ли?
Разделение на Deep Links и Android App Links
Перед тем, как мы займемся реализацией, важно понять, что есть два способа обработки ссылок:
1. Deep Links
Глубокие ссылки (Deep Links) — это URL, которые направляют пользователя на определённый контент в вашем приложении. Они реализуются созданием интент-фильтра и извлечением информации из входящих интентов. Если на телефоне установлены приложения, которые могут обрабатывать такие же интенты, то пользователю будет предложено несколько приложений на выбор, и он сможет выбрать через какое открыть ссылку.
2. Android App Links
Android App Links доступны только с Android 6.0 (API 23) и позволяют назначать приложение дефолтным обработчиком ссылок определённого типа. Главное отличие от Deep Links заключается в том, что никакое другое приложение кроме вашего не сможет обработать ссылку.
В этой статье будет рассматриваться первый тип ссылок — Deep Links.
Постановка задачи
Давайте на простом и типичном примере посмотрим как можно добавить обработку глубоких ссылок в приложение.
Допустим, у нас есть сайт с вакансиями, на котором каждой вакансии соответствует ссылка вида https://awesomejobs.com/jobs/{id}. Мы хотим, чтобы пользователям, у которых установленно наше приложение, при клике на ссылку предлагалось открыть её или через наше приложение, или через браузер.
Реализация
- Начнем с добавления нового
intent-filter
вActivity
, на которую мы хотим направлять пользователя. Это нужно для того, чтобы система понимала какого вида ссылки мы хотим обрабатывать. ВAndroidManifest.xml
нужно добавить следующие строки:
<activity android:name="com.awesomejobsapp.ui.activity.JobActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https"
android:host="awesomejobs.com"
android:pathPrefix="/jobs" />
</intent-filter>
</activity>
- action
android.intent.action.VIEW
говорит о том, что Activity предназначена для отображения контента. - category
android.intent.category.BROWSABLE
требуется для того, чтобы мобильный браузер смог выполнить открытие ссылки из результатов поиска Google. Без этого аттрибута при клике по ссылке в мобильном браузере она будет открываться в самом же браузере.
category android.intent.category.DEFAULT
требуется если вы хотите чтобы приложение обрабатывало ссылку с любого ссылающегося сайта. Интент, который используется при переходе из результатов поиска Google знает, что должен открыть именно ваше приложение, поэтому явно указывает на него как на получателя. Ссылки же с других сайтов не знают ничего о вашем приложении, поэтому категория DEFAULT
говорит о том, что приложение способно принять неявный Intent от них.
2. Наше приложение научилось ловить интенты извне, теперь нам нужно написать код для того, чтобы перехватывать их, доставать id вакансии и с ним уже делать всё, что нам захочется (запрашивать с сервера информацию о вакансии с таким id и отображать её, например).
Для этого в метод onCreate
активити, которую мы использовали в манифесте, добавим следующий код:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_job);
final Intent intent = getIntent();
final String action = intent.getAction();
final String data = intent.getDataString();
if (Intent.ACTION_VIEW.equals(action) && data != null) {
final String jobId = data.substring(data.lastIndexOf("/") + 1);
loadJobDetails(jobId);
}
}
Активити запускается интентом, содержащем в себе ссылку. data
— это и есть не что иное, как наша ссылка. Получив её и выполнив необходимые проверки, мы вырезаем из неё id вакансии, подтягиваем её детали с сервера и отображаем на экране. Всё предельно просто.