Одним из нововведений Android 7.1 Nougat является добавление Shortcuts в приложения. Шорткаты – это элементы на иконке приложения, которые позволяют выполнить какое-либо действие в приложении за один клик. Каждый шорткат содержит в себе один или более намерений (Intent), которые посылают в приложение определённые действия, короткий и длинный текст для отображения на экране, а также иконку.
Существует два вида shortcuts:
- Статический шорткат
Такие шорткаты хранятся в xml-файле, создать такие шорткаты просто, но их нельзя изменять и модифицировать без обновления приложения. По этой причине такие шорткаты используются как правило для постоянных действий, которые в будущем не будут меняться в приложении.
Чтобы создать статический шорткат, необходимо:
- В файле AndroidManifest.xml найти тег <activity>, имеющий интент-фильтры android.intent.action.MAIN и android.intent.category.LAUNCHER.
- Добавить внутри <acitivity> тег <meta-data>, в котором будут указаны имя и xml-файл с шорткатами в качестве ресурса.
- В указанном xml-файле описать шорткаты, общая их структура выглядит следующим образом:
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="compose"
android:enabled="true"
android:icon="@drawable/compose_icon"
android:shortcutShortLabel="@string/compose_shortcut_short_label1"
android:shortcutLongLabel="@string/compose_shortcut_long_label1"
android:shortcutDisabledMessage="@string/compose_disabled_message1">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.myapplication"
android:targetClass="com.example.myapplication.ComposeActivity" />
<!-- If your shortcut is associated with multiple intents, include them
here. The last intent in the list determines what the user sees when
they launch this shortcut. -->
<categories android:name="android.shortcut.conversation" />
</shortcut>
<!-- Specify more shortcuts here. -->
</shortcuts>
- Динамический шорткат
Как следует из названия, динамические шорткаты в отличие от статических могут быть изменены в процессе использования приложения. Для создания таких шорткатов используется класс ShortcutManager.
- В нужной активности создаётся объект класса ShortcutManager.
- В этот объект с помощью метода setDynamicShortcuts() необходимо добавить объекты ShortcutInfo, каждый из которых содержит информацию о шорткате и действия при нажатии на него.
Для примера динамические шорткаты были добавлены в приложение Timer, урок по созданию которого можно найти в архиве сайта. Важно помнить, что Shortcuts могут быть использованы только в версии API 25 и выше, более старые версии не поддерживают такую возможность.
Для того, чтобы создать динамические шорткаты, в методе onCreate() главной активности был добавлен следующий код:
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo shortcutStopwatch = new ShortcutInfo.Builder(this, "idStopwatch")
.setShortLabel("Stopwatch")
.setLongLabel("Open stopwatch")
.setIcon(Icon.createWithResource(MainActivity.this, R.drawable.ic_timer_black_48dp))
.setIntent(new Intent(MainActivity.this, MainActivity.class).setAction(ACTION_STOPWATCH))
.build();
ShortcutInfo shortcutTimer = new ShortcutInfo.Builder(this, "idTimer")
.setShortLabel("Timer")
.setLongLabel("Open timer")
.setIcon(Icon.createWithResource(MainActivity.this, R.drawable.ic_timer_10_black_48dp))
.setIntent(new Intent(MainActivity.this, MainActivity.class).setAction(ACTION_TIMER))
.build();
shortcutManager.setDynamicShortcuts(Arrays.asList(shortcutStopwatch, shortcutTimer));
Здесь создаются два шортката для открытия разных вкладок приложения и помещают в ShortcutManager. Затем намерения, объявленные в шорткатах отлавливаются там же в onCreate()
switch (getIntent().getAction()){
case ACTION_STOPWATCH: {
showStopwatch();
break;
}
case ACTION_TIMER: {
showTimer();
break;
}
default:
break;
}
Итоговый результат получился следующим:
Кроме того, шорткаты можно перетаскивать на основной экран, чтобы не было необходимо искать иконку приложения.