- Adding Static shortcuts to an existing Android App
- Icons
- Изучаем App Shortcuts в Android Nougat 7.1
- Конечный результат выглядит так:
- Что такое App Shortcuts и зачем они нужны?
- Они бывают двух типов:
- Добавление ярлыков
- STATIC SHORTCUTS
- DYNAMIC SHORTCUTS
- SHORTCUT ORDERING
- EXTRA BITS
- Обзор Android Shortcuts
- Общий обзор
- Основные компоненты
- Виды шорткатов
- Статические шорткаты
- Динамические шорткаты
- Закрепленные шорткаты
- Детали и тонкости применения
Adding Static shortcuts to an existing Android App
Jun 13, 2017 · 3 min read
Static shortcuts were introduced in Android 7.1 (API Level 25) and make it super easy to give users quick access to your app.
I’m a big fan of Airbnb’s open source animation library Lottie. Animations have been notoriously difficult to create on Android and this library takes away all of that pain. To showcase this library, Airbnb have released a sample app on the play store. I use this frequently to view animations and play around with the awesome animated typography.
I decided to add st a tic shortcuts to this sample app so I can access all of its features even quicker. The sample app consists of a main list activity with 4 options.
Tapping these options will either launch a fragment or activity. My goal was to bypass this initial screen with the shortcuts and launch each feature directly from the user’s home screen.
First I need to get some icons for my shortcuts!
Icons
Before diving in and creating your shortcuts it’s worth giving the App Shortcuts Design Guidelines a read through. This covers the specifics of creating a shortcut. Initially I used the fantastic Android Asset Studio by Roman Nurik as he has already developed a shortcuts icon generator. However after some PR feedback I created my own vector drawables (Android asset studio only generates png). For quick reference the outer circle is 48dp by 48dp and the inner icon should be 24dp by 24dp. Even a sketch novice like myself managed to create some decent-looking icons!
Following the steps in the dev docs you must first define your shortcuts.xml file in your manifest.
Then create your shortcuts file and add shortcuts accordingly.
It’s pretty much as simple as that! After defining which icon and text you wish to show it’s mostly a matter of specifying your target action and class.
For the case of Lottie I wanted to launch the main list activity for each shortcut then open the corresponding screen, this way the back button would navigate to the list as expected and not exit the app. To achieve this I set a specific action for each shortcut and then retrieved this action using getIntent().getAction().
If you need more control over your shortcuts you can use dynamic shortcuts. The ShortcutManager API can create, update and delete shortcuts on the fly.
Here’s my pull request for Lottie Android if you want to go through the code in its entirety.
Источник
Изучаем App Shortcuts в Android Nougat 7.1
Привет Хабр! Предлагаю вашему вниманию свободный перевод статьи «Exploring Android Nougat 7.1 App Shortcuts» от Andrei Catinean.
Google выпустил Android Nougat с версией 7.1 (API 25). Появились некоторые интересные функции под капотом. Одна из этих дополнительных функций — app shortcuts. Эта статья расскажет, что они собой представляют, как они работают, и как вы можете их реализовать.
Конечный результат выглядит так:
Что такое App Shortcuts и зачем они нужны?
Ярлыки приложений — это средство изображения общих действий или задач вашего приложения на главном экране пользователя. Ваши пользователи могут раскрыть ярлыки при долгом нажатии запуска программы. С технической точки зрения, ярлыки приложений — это простой и быстрый способ использования intents.
Они бывают двух типов:
Предоставляя свои общие задачи, вы упростите пользователям возможность быстро вернуться к определенным частям вашего приложения без дополнительной навигации и без лишних переходов по активностям.
Добавление ярлыков
Добавление ярлыков в ваше приложение довольно просто. Начнем с создания простого статического ярлыка.
STATIC SHORTCUTS
В этом примере предполагается, что у вас уже создан проект в Android Studio.
Перейдите в AndroidManifest.xml и добавьте следующий тег метаданных в свою основную активность:
В теге meta-data ключ android:resource соответствует ресурсу, определенному в файле res / xml / shortcuts.xml. Здесь вам нужно определить все ваши статические ярлыки. Давайте добавим тот, который откроет определенную активность из вашего приложения.
В приведенном ниже примере я создал фиктивный StaticShortcutActivity:
Вы можете видеть, что корневой тег этого файла , который может содержать несколько блоков . Каждый из них, как вы могли догадаться, представляет собой статический ярлык. Здесь для одного ярлыка можно задать следующие свойства:
- enabled: Как указано в названии, включен ли ярлык или нет. Если вы решите отключить статический ярлык, вы можете либо установить значение false, либо просто удалить его из набора .
- icon: значок, который будет показан в левой части ярлыка.
- shortcutDisabledMessage: это строка, которая будет показана пользователю, если он попытается запустить отключенный ярлык. Прим. переводчика: Такое может произойти, когда ярлык не убрали с главного экрана устройства.
- shortcutLongLabel: это более длинный вариант описания ярлыка, который отображается, когда имеется достаточно места.
- shortcutShortLabel: краткое описание ярлыка. Данное поле является обязательным. Это текст ярлыка, который пользователь увидит на своем главном экране.
- intent: здесь вы определяете свое намерение (или несколько намерений), которое ваш ярлык откроется при нажатии.
Вот как этот ярлык будет отображаться пользователю вашего приложения:
Просто и понятно, но если вы это реализуете, то вы можете заметить, что при нажатии на кнопку «назад» пользователь возвращается на домашний экран.
Как насчет того, чтобы вместо этого перейти в приложение? Для этого мы можем добавить несколько intent-тэгов в ярлыках, которые мы ранее создали:
Обратите внимание, как мы добавили дополнительный до того, что у нас было, указав на MainActivity. Это создаст back stack намерений, последний из которых будет открыт ярлыком. В нашем случае back stack выглядит как MainActivity → Static ShortcutActivity, поэтому при нажатии назад пользователь переходит в MainActivity:
Добавление статических ярлыков довольно просто. Давайте перейдем к динамическим.
DYNAMIC SHORTCUTS
Как следует из их названия, динамические ярлыки могут быть изменены во время выполнения без необходимости повторного открытия вашего приложения. Как вы могли догадаться, они не определяются через статический ресурс ( shortcuts.xml ), как статические, но создаются в коде.
Давайте добавим наш первый динамический ярлык! Для этого вам нужно будет использовать ShortcutManager и ShortcutInfo.Builder. Я буду создавать первый динамический ярлык в моей MainActivity.#OnCreate ():
В приведенном выше примере мы используем shortcutManager и создаем ShortcutInfo. Используя ShortcutInfo.Builder, мы можем установить различные свойства для ярлыка, который мы хотим создать. Все методы, которые мы используем выше, соответствуют тем же, что и для статического ярлыка. Однако одно свойство, которое является немного неясным, является идентификатором ярлыка, который определен в конструкторе StaticInfo.Builder как второй параметр — shortcut_web. В приведенном выше примере я определил намерение, которое откроет мой сайт. Наконец, я установил динамический ярлык в ShortcutManager. Посмотрим теперь, как выглядят наши ярлыки:
Круто! Теперь у нас есть 2 быстрых ярлыка в нашем приложении — один статический и одий динамический.
Давайте добавим еще один, который укажет на активность внутри приложения и посмотрим, как мы можем создать для него back stack:
Вы можете видеть, что теперь мы создаем setIntents () в builder’е, чтобы построить back stack:
Первое намерение соответствует MainActivity. Мы определяем флаг FLAG_ACTIVITY_CLEAR_TASK, чтобы очистить все существующие задачи, связанные с приложением, и сделать MainActivity текущим корневым действием
Объявив массив намерений в этом порядке, то гарантируем, что когда пользователь вернется после открытия DynamicShortcutActivity, то MainActivity будет открыт.
Как это выглядит:
SHORTCUT ORDERING
Теперь, когда у нас есть 1 статический ярлык и 2 динамических, как мы можем задать для них порядок? Если мы более подробно рассмотрим методы ShortcutInfo.Builder, в частности: setRank (int). Установив настраиваемый ранг в динамический ярлык, мы можем контролировать порядок, в котором они появляются: чем выше ранг, тем выше ярлык.
В качестве примера, скажем, мы хотим, чтобы ярлык №2 (novoda.com) находился на вершине. Мы можем динамически изменять ряды уже добавленных динамических ярлыков. Давайте сделаем это, нажав кнопку в MainActivity:
В слушателе кнопки мы создаем новый ShortcutInfo для каждого ярлыка, которые мы ранее добавляли с теми же идентификаторами, но теперь мы устанавливаем более высокий ранг в shortcut_web, а нижний — для shortcut_dynamic. Наконец, мы используем метод updateShortcuts (List ) для обновления ярлыков:
Вы можете видеть из приведенной выше гифки, что статический ярлык находится внизу списка. Важное замечание: вы не можете изменить ранг статического ярлыка. Они будут показаны в том порядке, в котором они определены в файле shortcuts.xml. Поскольку у нас есть только один статический ярлык, он имеет ранг по умолчанию 0, который нельзя изменить.
EXTRA BITS
Если мы более подробно рассмотрим метод setShortLabel (CharSequence), мы увидим, что он принимает CharSequence в качестве параметра. Что это значит? Ну, это означает, что мы можем немного поиграть с ним 🙂
Предположим, мы хотим изменить цвет на красный, нажав на созданную выше кнопку. Мы можем создать SpannableStringBuilder и установить для него ForegroundColorSpan требуемый цвет, а затем передать spannableStringBuilder как shortLabel (поскольку SpannableStringBuilder реализует CharSequence):
Источник
Обзор Android Shortcuts
С версии ОС Android 7.1 (API 25) Google предлагает нам новый механизм работы с приложениями — Android Shortcuts. Мы написали краткий обзор этой фичи, созданной для удобства пользователей.
Общий обзор
В переводе с английского «shortcut» — кратчайший путь, такое название хорошо отражает основное предназначение шорткатов. Они позволяют нам попасть в какую-то определенную точку приложения и выполнить конкретное действие всего за пару нажатий. Шорткаты неплохо смотрятся, например, если пользователю надо:
• выбрать заранее определенный маршрут в навигаторе;
• начать беседу с другом в мессенджере;
• продолжить игру с последней точки сохранения.
Основные компоненты
Шорткат включает в себя:
1) интент или массив интентов, которые запускают конкретное действие;
2) идентификатор или ID, определяющий именно этот шорткат;
3) короткое и длинное сообщения, отображающиеся при его показе;
4) иконка слева от текста.
Чтобы лучше разобраться в механике работы с шорткатами, рассмотрим их классификацию.
Виды шорткатов
Android предлагает 2 вида шорткатов (на самом деле их три, но об этом ниже): статические и динамические. Далее рассмотрим каждый тип шорткатов с небольшими примерами и пояснениями.
Статические шорткаты
Описание статических шорткатов содержится в xml -файле. Они создаются один раз, их нельзя удалить, добавить и изменить без обновления приложения, но их достаточно просто создать.
Файл shortcuts.xml , содержащийся в res/xml/ :
И пара строк в AndroidManifest.xml :
Удалить шорткат или поменять его составляющие никак не получится, пока приложение не будет обновлено.
Статические шорткаты рекомендуется использовать для тех действий, которые точно никак не изменятся из-за пользовательских манипуляций с приложением и всегда будут доступны. Например, открыть новый поисковый запрос, перейти в настройки уведомлений, начать новую беседу. Однако использовать статический шорткат, к примеру, для того, чтобы отправлять пользователя сразу на экран авторизации — не очень хорошая идея. А что, если он уже авторизован? Тогда это действие не имеет смысла. В таких случаях нам пригодятся динамические шорткаты.
Динамические шорткаты
Их можно добавлять, удалять, изменять в режиме реального времени, то есть в зависимости от тех или иных событий. Вернемся к примеру с авторизацией: если пользователь не авторизован, то добавляем этот шорткат, как только авторизовался — удаляем.
Все взаимодействие с шорткатами программно происходит через класс ShortcutManager, доступный для 23 версии API, однако большинство его методов доступны только для 25 версии API. Операции с ними достаточно просты, но есть некоторые нюансы, которые будут подробно рассмотрены дальше.
Удалять и изменять динамические шорткаты также достаточно просто:
Закрепленные шорткаты
На самом деле есть еще один вид шорткатов — это, если дословно переводить, «приколотые» или «закрепленные» (pinned) шорткаты. Выглядят они так:
Создавать такие шорткаты программным образом нельзя, как и удалять. Это может сделать только сам пользователь. Но с помощью кода их можно отключить ( disableShortcuts() ). Можно закреплять как статические, так и динамические шорткаты.
При дизейбле любого шортката можно задать соответствующее сообщение, которое будет выведено пользователю при нажатии на него.
Мы ознакомились с шорткатами и основными принципами их работы в целом. Теперь можно перейти к деталям, особенностям и практическим советам.
Детали и тонкости применения
1. При добавлении шорткатов в большинстве случаев они будут отображаться от первого добавленного к последнему, первый добавленный будет ближе всех к иконке приложения. Сначала будут отображены статические, затем динамические.
2. При создании шортката необходимо установить длинное и короткое сообщения. Длинное сообщение указывается в списке, если оно не вмещается — то короткое. Google рекомендует устанавливать короткое сообщение не более 10 символов, а длинное — не более 25.
3. Несмотря на то, что можно добавить максимально пять шорткатов, Google рекомендует не добавлять более четырех. Да и в списке больше четырех шорткатов не отобразится (последний добавленный не покажется). Зачем нужен пятый шорткат — загадка, ведь на планшетах он тоже не отображается.
4. У атрибута targetPackage статических шорткатов есть одна особенность — он может иметь только хардкод-значение. Если у Вас для разных сборок приложения используются различные суффиксы applicationId , то при объявлении шортката указать значение targetPackage ссылкой, например, @string/shortcut_target_package , не получится. Придется создавать файл shortcuts.xml отдельно для каждого buildFlavour приложения и прописывать необходимый targetPackage вручную с нужным суффиксом applicationId .
5. Важно, что Android сам никак не регулирует количество добавляемых шорткатов. Если вы по какой-то причине захотите добавить шестой шорткат, приложение просто упадет, выбросив IllegalArgumentException: Max number of dynamic shortcuts exceeded . Самостоятельно следите за количеством добавляемых шорткатов.
6. Если не задать хотя бы одному интенту шортката атрибут action, то в случае динамического шортката приложение упадет при создании этого шортката, а в случае статического — шорткат просто не будет создан. Отметим, что в extras интентов шортката нельзя положить некоторые типы, например, Serializable , допустимые типы можно увидеть в исходниках PersistableBundle.
7. Если попытаться вызвать getSystemService(ShortcutManager.class) на устройстве ниже 23 API, то приложение упадет с ClassNotFoundException .
8. При добавлении нескольких интентов к шорткату, которые обрабатываются разными активностями, можно выстроить определенный стек активностей. Самой нижней в этом стеке будет активность, обработавшая первый добавленный интент.
9. Если пользователь заблокирован на устройстве, то воспользоваться шорткатами у него не получится — они содержатся в зашифрованном хранилище.
10. Если пользователь хочет поддерживать приложение на другом устройстве, то только «закрепленные» шорткаты будут воссозданы на нем. Динамические и статические не воссоздаются, однако статические будут заново определены при установке приложения. Если вас волнует поддержка приложения на разных устройствах, и вы не поставили флаг allowBackup = false в Манифесте, нужно заботиться только о ручном воссоздании динамических шорткатов.
11. Android developers также предлагают нам использовать метод reportShortcutUsed(String id) при выполнении действия из соответствующего шортката — как при нажатии на шорткат, так и локально в приложении, если действие то же самое. Как утверждают разработчики, должна быть статистика использования тех или иных действий из шорткатов, и на основе этой статистики пользователю могут предлагаться определенные шорткаты. Возможно, именно здесь должен раскрыться потенциал пятого шортката.
Напоследок парочка еще не упомянутых советов от Android developers.
1. Обновляйте шорткаты ( updateShortcuts() ), если их содержание и значение не изменилось, а изменилось только отображаемое сообщение или иконка. Если вы хотите убрать один шорткат и добавить другой, то не используйте обновление, выполните операции удаления, а затем добавления. Пренебрегая этим советом, можно получить разного рода казусы с «закрепленными» шорткатами.
2. Следуйте руководству по дизайну шорткатов. Это небольшой документ, которому нетрудно следовать.
Источник