Управление ярлыками, Управление ярлыками

После создания ярлыков вам может потребоваться управлять ими на протяжении всего срока службы вашего приложения. Например, вы можете оптимизировать свое приложение, определив, как часто пользователи выполняют определенные действия с помощью ярлыков. В другом случае вы можете решить отключить закрепленный ярлык, чтобы ваше приложение не выполняло устаревшие или отсутствующие действия. Для ярлыков, упоминаемых в беседах, вы можете отслеживать использование, чтобы предоставлять сигналы, повышающие рейтинг ярлыков.

На этой странице описаны эти и некоторые другие распространенные способы управления ярлыками.

Ярлык поведения

В следующих разделах содержится общая информация о поведении ярлыков, включая видимость, порядок отображения и ранги.

Видимость ярлыка

Статические и динамические ярлыки появляются в поддерживаемом средстве запуска или помощнике, когда пользователь выполняет определенный жест или голосовую команду. В поддерживаемых программах запуска этот жест представляет собой прикосновение и удержание значка программы запуска приложения, но в других приложениях запуска этот жест может отличаться. С помощью Google Assistant ярлыки можно отображать в Assistant или запускать с помощью голосовой команды пользователя.

Класс LauncherApps предоставляет API-интерфейсы для приложений запуска для доступа к ярлыкам.

Поскольку закрепленные ярлыки появляются в самой панели запуска, они всегда видны. Закрепленный ярлык удаляется из лаунчера только в следующих ситуациях:

  • Пользователь удаляет его.
  • Приложение, связанное с ярлыком, будет удалено.
  • Пользователь очищает данные приложения, перейдя в «Настройки» > «Приложения и уведомления» , выбрав приложение, затем нажав « Память» > «Очистить хранилище» .

Цели общего доступа — это подмножество динамических ярлыков, которые отображаются в строке прямого общего доступа на листе общего доступа Android.

Скриншот Android Sharesheet
Рисунок 1. Общая таблица Android. Цели прямого распространения отображаются в первой строке, за ними следуют рейтинговые приложения, а затем списки приложений.

Порядок отображения ярлыков

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

  1. Статические ярлыки : ярлыки, метод isDeclaredInManifest() которых возвращает true .
  2. Динамические ярлыки : ярлыки, метод ShortcutInfo.isDynamic() которых возвращает true .

В каждом типе ярлыков — статических и динамических — ярлыки сортируются в порядке возрастания ранга в соответствии с ShortcutInfo.getRank . Google Assistant также учитывает рейтинг ярлыков при определении контекстных ярлыков для отображения пользователям.

Ранги представляют собой неотрицательные последовательные целые числа. Статические ярлыки ранжируются от первого к последнему в том порядке, в котором они появляются в файле shortcuts.xml . Для динамических ярлыков вы можете обновить ранги существующих ярлыков при вызове updateShortcuts(Context, List) , addDynamicShortcuts(Context, List) , pushDynamicShortcut(Context, ShortcutInfoCompat) или setDynamicShortcuts(Context, List) .

Порядок целей общего доступа зависит от различных факторов, включая прошлую историю пользователей, новизну, частоту, подсказку о ранге , использование приложения и приоритет, установленный для разговора, связанного с ярлыком общего доступа. Цели общего доступа, созданные с помощью API ярлыков общего доступа, имеют приоритет над целями общего доступа, созданными ChooserTargetService , который устарел в Android 11. В Android 12 и более поздних версиях целевые объекты общего доступа, созданные устаревшим ChooserTargetService больше не будут отображаться на листе общего доступа.

Большинство программ запуска отображают максимум четыре ярлыка. Для любой комбинации статических и динамических ярлыков, которые определены, средство запуска отображает максимум два статических и два динамических ярлыка. Например, если вы определяете четыре статических ярлыка и программно создаете три динамических ярлыка, средство запуска отображает первые два статических ярлыка и два динамических ярлыка с самым высоким рейтингом.

Управление несколькими намерениями и действиями

Если вы хотите, чтобы ваше приложение выполняло несколько операций, когда пользователь активирует ярлык, вы можете настроить его на запуск последовательных действий. Этого можно добиться, назначив несколько намерений, запуская одно действие из другого или устанавливая флаги намерений, в зависимости от типа ярлыка.

Назначение нескольких намерений

При создании ярлыка с помощью ShortcutInfoCompat.Builder вы можете использовать setIntents() вместо setIntent() . Вызвав setIntents() , вы можете запускать несколько действий в вашем приложении, когда пользователь выбирает ярлык, помещая все действия, кроме последнего в списке, в задний стек . Если затем пользователь нажмет кнопку «Назад» на устройстве, он увидит другое действие в вашем приложении вместо того, чтобы вернуться в панель запуска устройства.

Начинайте одно действие с другого

Статические ярлыки не могут иметь собственные флаги намерений. Для первого намерения статического ярлыка всегда установлены Intent.FLAG_ACTIVITY_NEW_TASK и Intent.FLAG_ACTIVITY_CLEAR_TASK . Это означает, что когда ваше приложение работает, все существующие действия в нем уничтожаются при запуске статического ярлыка. Если вы не хотите такого поведения, вы можете использовать действие батута — невидимое действие, которое запускает другое действие — в Activity.onCreate(Bundle) , которое вызывает Activity.finish() :

  1. В файл AndroidManifest.xml включите назначение атрибута android:taskAffinity= "" в действие батута.
  2. В файле ресурсов ярлыков укажите действие прыжка на батуте в намерении внутри статического ярлыка.

Дополнительную информацию о занятиях на батуте см. в разделе «Начало одного занятия с другого» .

Установить флаги намерения

Вы можете публиковать динамические ярлыки с любым набором флагов Intent . Предпочтительно указать Intent.FLAG_ACTIVITY_CLEAR_TASK вместе с другими флагами. В противном случае, если вы попытаетесь запустить другую задачу во время работы приложения, целевое действие может не появиться.

Дополнительные сведения о задачах и флагах намерений см. в разделе Задачи и задний стек .

Обновить ярлыки

Значок средства запуска каждого приложения может содержать не более нескольких статических и динамических ярлыков, которые равны значению, возвращаемому getMaxShortcutCountPerActivity . Количество закрепленных ярлыков, которые может создать приложение, не ограничено.

Когда динамический ярлык закреплен, даже если издатель удаляет его как динамический ярлык, закрепленный ярлык по-прежнему виден и доступен для запуска. Это позволяет приложению иметь больше ярлыков, чем getMaxShortcutCountPerActivity() .

Рассмотрим следующий пример, в котором предполагается, что значение, возвращаемое функцией getMaxShortcutCountPerActivity() равно 4 :

  1. Приложение чата публикует четыре динамических ярлыка, представляющих четыре последних разговора: c1, c2, c3 и c4.
  2. Пользователь закрепляет все четыре ярлыка.
  3. Позже пользователь начинает три дополнительных диалога: c5, c6 и c7. Приложение-издатель повторно публикует свои динамические ярлыки. Новый динамический список ярлыков: c4, c5, c6 и c7.

Приложению необходимо удалить c1, c2 и c3, поскольку оно не может отображать более четырех динамических ярлыков. Однако c1, c2 и c3 по-прежнему являются закрепленными ярлыками, к которым пользователь может получить доступ и запустить их.

После этого пользователь сможет получить доступ к семи ярлыкам, которые ссылаются на действия в приложении издателя. Это связано с тем, что общее число включает максимальное количество ярлыков и три закрепленных ярлыка.

  1. Приложение может использовать updateShortcuts(Context, List) для обновления любого из существующих семи ярлыков. Например, вы можете обновить этот набор ярлыков при изменении значков участников чата.
  2. Вы можете использовать методы addDynamicShortcuts(Context, List) и setDynamicShortcuts(Context, List) для обновления существующих ярлыков с теми же идентификаторами. Однако вы не можете использовать их для обновления нединамических закрепленных ярлыков, поскольку эти два метода пытаются преобразовать заданные списки ярлыков в динамические ярлыки.

Нет ограничений на количество ярлыков, которые можно отображать в приложениях-помощниках, таких как Google Assistant. Используйте метод pushDynamicShortcut() библиотеки ShortcutManagerCompat Jetpack, чтобы создавать и обновлять ярлыки для использования в приложениях-помощниках. Кроме того, добавьте библиотеку интеграции Google Shortcuts в свое приложение, чтобы динамические ссылки могли отображаться в Google Assistant.

Дополнительные сведения о рекомендациях по использованию ярлыков приложений, включая обновление ярлыков, см. в разделе «Рекомендации по использованию ярлыков» .

Обрабатывать изменения языкового стандарта системы

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

Отслеживание использования ярлыков

Чтобы определить ситуации, при которых появляются статические и динамические ярлыки, программа запуска изучает историю активации ярлыков. Для статических ярлыков вы можете отслеживать, когда пользователи выполняют определенные действия в вашем приложении, вызывая метод reportShortcutUsed() и передавая ему идентификатор ярлыка при возникновении любого из следующих событий:

  • Пользователь выбирает ярлык с заданным идентификатором.
  • Внутри приложения пользователь вручную выполняет действие, соответствующее тому же ярлыку.

Ваше приложение отслеживает использование динамических ярлыков, вызывая метод pushDynamicShortcut() и передавая ему идентификатор ярлыка при возникновении соответствующего события. Нажатие на динамическое использование ярлыков с помощью этого метода позволяет приложениям-помощникам, таким как Google Assistant, предлагать пользователям соответствующие ярлыки. Поскольку метод pushDynamicShortcut() сообщает об использовании при вызове, не вызывайте метод reportShortcutUsed() для тех же ярлыков.

Для ярлыков, связанных с разговором, важно отслеживать использование исходящих и входящих сообщений. Подробности см. в рекомендациях по работе с людьми и беседами.

Отключить ярлыки

Поскольку ваше приложение и его пользователи могут закреплять ярлыки на панели запуска устройства, вполне возможно, что эти закрепленные ярлыки могут направлять пользователей к действиям в вашем приложении, которые устарели или больше не существуют. Чтобы справиться с этой ситуацией, вы можете отключить ярлыки, которые вы не хотите, чтобы пользователи выбирали, вызвав disableShortcuts , который удаляет указанные ярлыки из списка статических и динамических ярлыков и отключает закрепленные копии этих ярлыков. Вы также можете использовать перегруженную версию этого метода, которая принимает CharSequence в качестве специального сообщения об ошибке. Это сообщение об ошибке появляется, когда пользователи пытаются запустить любой отключенный ярлык.

Ограничение скорости

При использовании методов setDynamicShortcuts(), addDynamicShortcuts() или updateShortcuts() вы можете вызывать эти методы только определенное количество раз в фоновом приложении — приложении, в котором нет действий или служб на переднем плане. Ограничение на определенное количество раз, которое вы можете вызывать эти методы, называется ограничением скорости . Эта функция предотвращает чрезмерное потребление ресурсов устройства ShortcutManagerCompat .

Когда ограничение скорости активно, isRateLimitingActive() возвращает true. Однако ограничение скорости сбрасывается во время определенных событий, поэтому даже фоновые приложения могут вызывать методы ShortcutManager до тех пор, пока ограничение скорости не будет достигнуто снова. Эти события включают в себя следующее:

  • Приложение выходит на передний план.
  • Язык системы изменится.
  • Пользователь выполняет действие встроенного ответа на уведомление.

Если вы столкнулись с ограничением скорости во время разработки или тестирования, вы можете выбрать «Параметры разработчика» > «Сбросить ограничение скорости ShortcutManager» в настройках устройства или ввести следующую команду в adb :

$ adb shell cmd shortcut reset-throttling [ --user your-user-id ]

Резервное копирование и восстановление

Вы можете разрешить пользователям выполнять операции резервного копирования и восстановления в вашем приложении при смене устройств, включив назначение атрибута android:allowBackup="true " в файл манифеста вашего приложения. Если вы поддерживаете резервное копирование и восстановление, помните о следующих моментах, касающихся ярлыков приложений:

  • Статические ярлыки повторно публикуются автоматически, но только после того, как пользователь переустановит ваше приложение на новом устройстве.
  • Динамические ярлыки не резервируются, поэтому включите в свое приложение логику, чтобы повторно публиковать их, когда пользователь открывает ваше приложение на новом устройстве.
  • Закрепленные ярлыки автоматически восстанавливаются в средстве запуска устройства, но система не сохраняет резервные копии значков, связанных с закрепленными ярлыками. Поэтому сохраните изображения закрепленных ярлыков в своем приложении, чтобы их можно было легко восстановить на новом устройстве.

В следующем фрагменте кода показано, как лучше всего восстановить динамические ярлыки вашего приложения и как проверить, сохранились ли закрепленные ярлыки вашего приложения:

Котлин

class MyMainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (ShortcutManagerCompat.dynamicShortcuts.size == 0) {
            // Application restored. Re-publish dynamic shortcuts.
            if (ShortcutManagerCompat.pinnedShortcuts.size > 0) {
                // Pinned shortcuts are restored. Use updateShortcuts() to make
                // sure they contain up-to-date information.
            }

        }
    }
    // ...
}

Ява

public class MainActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (ShortcutManagerCompat.getDynamicShortcuts().size() == 0) {
            // Application restored. Re-publish dynamic shortcuts.
            if (ShortcutManagerCompat.getPinnedShortcuts().size() > 0) {
                // Pinned shortcuts are restored. Use pdateShortcuts() to make
                // sure they contain up-to-date information.
            }
        }
    }
    // ...
}