Перевод статьи о нововведениях версии мобильной операционной системы Android Q. В этой статье описывается, как мы можем реализовать новый подход для Sharing Shortcuts в наших приложениях, а также некоторые вещи, которые следует учитывать при этом.
Несколько недель назад мы увидели анонс бета-версии Android Q. С этой версией Android приходит коллекция захватывающих изменений. В этом наборе статей я собираюсь углубиться в каждую из них, чтобы мы были полностью готовы к тому, как подготовить наши приложения!
Примечание. Код этой статьи можно найти здесь.
Как указано в примечаниях к выпуску бета-версии для Android Q, одним из изменений, которые мы наблюдаем, являются некоторые изменения в том, как работает функция Direct Share Android. Direct Share API позволяет разработчикам предусматривать прямых получателей, с которыми мы хотели бы поделиться контентом через лист обмена system share sheet – будь то контакт в вашем любимом приложении для обмена сообщениями или электронная почта. Это дает вам быстрый способ поделиться контентом с ними напрямую. Однако, хотя эта функция довольно аккуратна, ее выполнение никогда не было гладким. Одна из важных вещей – это задержка загрузки этих контактов – посмотрите пример ниже:
Здесь вы заметите задержку загрузки опций Direct Share. Это часто случалось со мной также всякий раз, когда я открывал список system share sheet. Несколько раз я случайно делился чем-то с контактом, а не с приложением, потому что после задержки загружалось больше опций, и мой первоначальный выбор перемещался дальше вниз по листу обмена.
Чтобы улучшить опыт, предоставляемый system share sheet, у нас теперь есть доступ к новому подходу, известному как Sharing Shortcuts. Это изменяет способ, которым приложения предоставляют эти прямые параметры для совместного использования, а это означает, что они будут извлечены намного быстрее при открытии system share sheet, исключая некоторые задержки, которые ранее имели место.
Чтобы это работало, нам нужно предоставить список целей общего ресурса, которые будут использоваться во время выполнения. Способ, которым это реализовано, очень похож на API-интерфейсы ярлыков, которые мы использовали в наших приложениях, что позволяет пользователям легко получать доступ к функциям нашего приложения. И подобно тому, как мы объявляем статические ярлыки приложений, определение этих ярлыков общего ресурса начинается с объявления цели общего ресурса в нашем каталоге res / xml. Здесь мы объявляем элемент shortcuts с вложенной share-target – эта цель используется для определения:
- Target class: используется для объявления действия, которое должно быть запущено при активном использовании общего ресурса.
- Mime type: тип данных, для которого должна быть указана общая цель.
- Category name: имя категории общего ресурса, оно также будет использоваться программно при настройке цели общего ресурса. Можно определить несколько категорий.
Так, например, если бы у меня было действие под названием ShareActivity, которое обрабатывало общие текстовые ресурсы, то XML-файл ярлыков, определяющий это, выглядел бы так:
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<share-target android:targetClass="co.joebirch.androidqplayground.ShareActivity">
<data android:mimeType="text/plain" />
<category android:name="co.joebirch.androidqplayground.category.TEXT_SHARE_TARGET" />
</share-target>
</shortcuts>
Как только это будет определено, нам нужно создать ссылку на наши Sharing Shortcuts в файле манифеста приложения:
<activity android:name=".MainActivity">
...
<meta-data android:name="android.app.shortcuts"
android:resource="@xml/share_shortcuts" />
</activity>
Далее нам нужно добавить наши ярлыки в систему ShortcutManager, чтобы система знала о наших ярлыках и могла отображать их в листе обмена system share sheet. Здесь мы собираемся использовать Builder для класса ShortcutInfoCompat, это поможет нам в создании наших ярлыков для отображения в system share sheet.
ShortcutInfoCompat.Builder(context, Integer.toString(id))
.setShortLabel(id.toString())
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_android_black_24dp))
.setIntent(Intent(Intent.ACTION_DEFAULT))
.setLongLived()
.setCategories(setOf(CATEGORY_TEXT_SHARE_TARGET))
.setPerson(
Person.Builder()
.setName(id.toString())
.build()
)
.build()
Хотя вы, возможно, уже использовали этот класс для создания ярлыков приложений, вы заметите, что в Android Q теперь есть несколько изменений:
- setCategories: хотя эта функция компоновщика уже была доступна ранее, теперь ее необходимо установить, если вы используете Sharing Shortcuts. Это сделано для того, чтобы система могла отфильтровать действия по отношению к общим намерениям.
- setLongLived: когда ярлык настроен на длительный срок службы, это означает, что системные службы могут по-прежнему получать к нему доступ из кэша даже после его удаления в качестве динамического ярлыка.
- setPerson: Это можно использовать для установки экземпляра Person, связанного с этим ярлыком. Хотя это не является обязательным свойством, когда дело доходит до обмена ярлыками, оно помогает системе предоставлять соответствующие предложения в общем доступе. Примечание: существует также функция компоновщика setPersons, которую можно использовать для добавления нескольких экземпляров Person.
Важно отметить, что эти цели (share targets) могут все еще нуждаться в обновлении в вашем приложении, так как в этом случае может не происходить добавление их по одному разу. Например, вы можете работать с приложением для обмена сообщениями, где пользователь добавил нового друга для общения или даже хочет изменить Sharing Shortcuts в зависимости от того, с кем пользователь регулярно делится контентом.
После того, как у нас есть наши ярлыки, мы можем использовать Менеджер ярлыков, чтобы добавить наши ярлыки:
ShortcutManagerCompat.addDynamicShortcuts(context, shortcuts)
Здесь вы заметите, что мы используем класс ShortcutManagerCompat вместо ShortcutManager, который мы могли использовать ранее. ShortcutManagerCompat от AndroidX и обеспечивает обратную совместимость при работе с API-интерфейсом DirectShare, который мы ранее использовали вместо Sharing Shortcuts. Однако, если мы хотим использовать ShortcutManagerCompat, мы должны добавить некоторые дополнительные метаданные к действию, которое должно обрабатывать намерение общего ресурса.
<activity android:name=".ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
</activity>
Теперь мы можем запустить наше приложение, нажать “Поделиться” и увидеть, что наши ярлыки общих ресурсов отображаются в общем списке:
Еще одна важная вещь, на которую стоит обратить внимание, это то, что это все еще ярлыки приложений. Поэтому, когда мы добавляем их с помощью ShortcutManager (или ShortcutManagerCompat) – даже если они были добавлены в качестве общих целей, они все равно будут отображаться в панели запуска приложений при длительном нажатии на значок приложения.
Хотя не все приложения могут использовать новую функциональность Sharing Shortcuts, это определенно все же улучшит работу системы Android, если вы сами являетесь пользователем Android. Если вы работаете с приложением, которое в настоящее время использует API-интерфейс DirectShare, то в ваших интересах перейти на этот новый подход. Когда устройство работает под управлением Android Q, общие цели, использующие ShortcutManager, будут иметь более высокий приоритет, чем те, которые добавлены через DirectShare API. Если другие приложения внедрили этот новый подход, то будет риск того, что ваши ярлыки будут скрыты от пользователей.
В этой статье описывается, как мы можем реализовать новый подход для Sharing Shortcuts в наших приложениях, а также некоторые вещи, которые следует учитывать при этом. Влияют ли эти изменения на ваше приложение, есть ли у вас вопросы по поводу чего-либо упомянутого выше? Пожалуйста, пишите в комментариях, что вы думаете об этом.
Перевод источника