Utwórz skróty

Skróty dostarczają użytkownikom określone typy treści, pomagając im szybko uzyskiwać dostęp do części aplikacji.

Kontrast między skrótami aplikacji a przypiętymi skrótami
Rysunek 1. skróty do aplikacji i przypięte skróty.

Sposób dostarczania treści za pomocą skrótów zależy od przypadku użycia i od tego, czy kontekst skrótu jest określany przez aplikację czy przez użytkownika. Chociaż kontekst skrótu statycznego się nie zmienia, a kontekst skrótu dynamicznego zmienia się nieustannie, w obu przypadkach kontekst jest określany przez aplikację. W przypadku gdy użytkownik wybiera sposób dostarczania treści przez aplikację, np. za pomocą przypiętego skrótu, kontekst jest określany przez użytkownika. Poniższe scenariusze opisują kilka przypadków użycia każdego typu skrótu:

  • Skróty statyczne najlepiej sprawdzają się w przypadku aplikacji, które łączą się z treściami za pomocą struktury spójnej przez cały okres interakcji użytkownika z aplikacją. Większość programów uruchamiających wyświetla jednocześnie tylko 4 skróty, dlatego skróty statyczne są przydatne do wykonywania rutynowych zadań w spójny sposób, np. gdy użytkownik chce wyświetlić kalendarz lub e-mail w określony sposób.
  • Skróty dynamiczne są używane w przypadku działań w aplikacjach, które są zależne od kontekstu. Skróty zależne od kontekstu są dostosowane do działań, które użytkownicy wykonują w aplikacji. Jeśli na przykład tworzysz grę, która umożliwia użytkownikowi rozpoczęcie rozgrywki od bieżącego poziomu, musisz często aktualizować skrót. Użycie skrótu dynamicznego umożliwia aktualizowanie skrótu za każdym razem, gdy użytkownik przejdzie poziom.
  • Przypięte skróty służą do wykonywania określonych działań inicjowanych przez użytkownika. Użytkownik może na przykład przypiąć konkretną witrynę do programu uruchamiającego. Jest to korzystne, ponieważ umożliwia użytkownikowi wykonanie niestandardowego działania, takiego jak przejście do witryny w jednym kroku, szybciej niż przy użyciu domyślnej instancji przeglądarki.

Tworzenie skrótów statycznych

Skróty statyczne zawierają linki do ogólnych działań w aplikacji, które muszą być spójne przez cały okres obowiązywania bieżącej wersji aplikacji. Dobre opcje skrótów statycznych to wyświetlanie wysłanych wiadomości, ustawianie alarmu i wyświetlanie aktywności fizycznej użytkownika w danym dniu.

Aby utworzyć skrót statyczny:

  1. W pliku AndroidManifest.xml aplikacji znajdź aktywność, której filtry intencji są ustawione na działanie android.intent.action.MAIN i kategorię android.intent.category.LAUNCHER.
  2. Dodaj do tej aktywności element <meta-data>, który odwołuje się do pliku zasobów, w którym zdefiniowane są skróty aplikacji:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.myapplication">
      <application ... >
        <activity android:name="Main">
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
          <meta-data android:name="android.app.shortcuts"
                     android:resource="@xml/shortcuts" />
        </activity>
      </application>
    </manifest>
    
  3. Utwórz nowy plik zasobów o nazwie res/xml/shortcuts.xml.

  4. W nowym pliku zasobów dodaj element główny <shortcuts>, który zawiera listę elementów <shortcut>. W każdym elemencie <shortcut> podaj informacje o statycznym skrócie, w tym jego ikonę, etykiety opisu i intencje, które uruchamia w aplikacji:

    <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.Main" />
        <!-- 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" />
        <capability-binding android:key="actions.intent.CREATE_MESSAGE" />
      </shortcut>
      <!-- Specify more shortcuts here. -->
    </shortcuts>

Dostosowywanie wartości atrybutów

Lista poniżej zawiera opisy różnych atrybutów w obrębie statycznego skrótu. Podaj wartość dla atrybutów android:shortcutId i android:shortcutShortLabel. Wszystkie inne wartości są opcjonalne.

android:shortcutId

Literał ciągu znaków, który reprezentuje skrót, gdy obiekt ShortcutManager wykonuje na nim operacje.

android:shortcutShortLabel

Krótkie zdanie opisujące przeznaczenie skrótu. Jeśli to możliwe, ogranicz ten krótki opis do 10 znaków.

Więcej informacji znajdziesz w sekcji setShortLabel().

android:shortcutLongLabel

Rozszerzone wyrażenie opisujące przeznaczenie skrótu. Jeśli jest wystarczająco dużo miejsca, zamiast android:shortcutShortLabel wyświetla tę wartość. W miarę możliwości ogranicz długi opis do 25 znaków.

Więcej informacji znajdziesz w sekcji setLongLabel().

android:shortcutDisabledMessage

Komunikat, który pojawia się w obsługiwanym programie uruchamiającym, gdy użytkownik próbuje uruchomić wyłączony skrót. Wiadomość musi wyjaśniać użytkownikowi, dlaczego skrót jest wyłączony. Wartość tego atrybutu nie ma wpływu, jeśli android:enabled ma wartość true.

android:enabled

Określa, czy użytkownik może korzystać ze skrótu w obsługiwanym programie uruchamiającym. Wartością domyślną parametru android:enabled jest true. Jeśli ustawisz wartość false, podaj android:shortcutDisabledMessage, które wyjaśnia, dlaczego wyłączasz skrót. Jeśli uważasz, że nie musisz podawać takiego komunikatu, całkowicie usuń skrót z pliku XML.

android:icon

Bitmapa lub ikona adaptacyjna, której launcher używa podczas wyświetlania skrótu użytkownikowi. Może to być ścieżka do obrazu lub pliku zasobu, który go zawiera. Jeśli to możliwe, używaj ikon adaptacyjnych, aby zwiększyć skuteczność i spójność.

Konfigurowanie elementów wewnętrznych

Plik XML, który zawiera listę statycznych skrótów aplikacji, obsługuje te elementy w każdym elemencie <shortcut>. W przypadku każdego zdefiniowanego przez Ciebie statycznego skrótu musisz dodać element wewnętrzny intent.

intent

Działanie, które system uruchamia, gdy użytkownik wybierze skrót. Ten zamiar musi zawierać wartość atrybutu android:action.

Do jednego skrótu możesz podać wiele intencji. Szczegółowe informacje znajdziesz w sekcjach Zarządzanie wieloma intencjami i aktywnościami, Ustawianie intencji oraz w dokumentacji klasy TaskStackBuilder.

categories

Zawiera grupę typów działań, które wykonują skróty aplikacji, np. tworzenie nowych wiadomości na czacie.

Listę obsługiwanych kategorii skrótów znajdziesz w ShortcutInfodokumentacji klasy.

capability-binding

Deklaruje możliwość powiązaną ze skrótem.

W poprzednim przykładzie skrót jest połączony z funkcją zadeklarowaną dla CREATE_MESSAGE, czyli wbudowanego zamiaru Działań w aplikacji. To powiązanie funkcji umożliwia użytkownikom korzystanie z poleceń głosowych w Asystencie Google w celu wywoływania skrótów.

Tworzenie skrótów dynamicznych

Skróty dynamiczne zawierają linki do konkretnych działań w aplikacji, które są dostosowane do kontekstu. Działania te mogą się zmieniać w zależności od tego, jak korzystasz z aplikacji, oraz podczas jej działania. Dynamiczne skróty można wykorzystać np. do dzwonienia do konkretnej osoby, nawigowania do określonej lokalizacji czy wczytywania gry od ostatniego zapisanego punktu. Możesz też używać skrótów dynamicznych, aby otwierać rozmowy.

Biblioteka Jetpack ShortcutManagerCompat to pomocnicza biblioteka interfejsu ShortcutManager API, która umożliwia zarządzanie dynamicznymi skrótami w aplikacji. Korzystanie z biblioteki ShortcutManagerCompat zmniejsza ilość powtarzalnego kodu i pomaga zapewnić spójne działanie skrótów w różnych wersjach Androida. Ta biblioteka jest też wymagana do przesyłania skrótów dynamicznych, aby mogły się one wyświetlać na platformach Google, takich jak Asystent, za pomocą biblioteki integracji skrótów Google.

Interfejs ShortcutManagerCompat API umożliwia aplikacji wykonywanie tych operacji za pomocą dynamicznych skrótów:

  • Wypychanie i aktualizowanie: użyj pushDynamicShortcut(), aby opublikować i zaktualizować dynamiczne skróty. Jeśli istnieją już skróty dynamiczne lub przypięte o tym samym identyfikatorze, każdy skrót modyfikowalny zostanie zaktualizowany.
  • Usuń:usuń zestaw dynamicznych skrótów za pomocą  removeDynamicShortcuts(). Usuń wszystkie skróty dynamiczne za pomocą removeAllDynamicShortcuts().

Więcej informacji o wykonywaniu operacji na skrótach znajdziesz w artykule Zarządzanie skrótami i w dokumentacji ShortcutManagerCompat.

Oto przykład tworzenia skrótu dynamicznego i powiązania go z aplikacją:

val shortcut = ShortcutInfoCompat.Builder(context, "id1")
    .setShortLabel("Website")
    .setLongLabel("Open the website")
    .setIcon(IconCompat.createWithResource(context, R.drawable.icon_website))
    .setIntent(
        Intent(
            Intent.ACTION_VIEW,
            Uri.parse("https://www.mysite.example.com/")
        )
    )
    .build()

ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)

Dodawanie biblioteki integracji skrótów Google

Biblioteka integracji skrótów Google to opcjonalna biblioteka Jetpack. Umożliwia ona przesyłanie dynamicznych skrótów, które mogą być wyświetlane w usługach Google i na platformach Androida, takich jak program uruchamiający. Korzystanie z tej biblioteki pomaga użytkownikom odkrywać skróty, które umożliwiają szybki dostęp do określonych treści lub powtarzanie działań w aplikacji.

Skróty dynamiczne przesyłane za pomocą tej biblioteki nie podlegają limitom skrótów egzekwowanym na poszczególnych urządzeniach. Dzięki temu aplikacja może wysyłać skrót za każdym razem, gdy użytkownik wykona w niej powiązane działanie. Wysyłanie w ten sposób często używanych skrótów pozwala Google poznać wzorce korzystania z aplikacji przez użytkownika i sugerować mu odpowiednie skróty.

Na przykład Asystent może się nauczyć na podstawie skrótów przesłanych z aplikacji do śledzenia aktywności, że użytkownik zwykle biega każdego ranka, i proaktywnie sugerować skrót „rozpocznij bieg”, gdy użytkownik rano weźmie telefon do ręki.

Biblioteka integracji skrótów Google nie oferuje żadnych funkcji, do których można się odwołać. Dodanie tej biblioteki do aplikacji umożliwia platformom Google korzystanie ze skrótów, które aplikacja wysyła za pomocą ShortcutManagerCompat.

Aby używać tej biblioteki w aplikacji, dodaj zależności dla biblioteki integracji skrótów Google i ShortcutManagerCompat do pliku app/build.gradle lub app/build.gradle.kts:

Kotlin

dependencies {
    implementation("androidx.core:core:1.6.0")
    implementation("androidx.core:core-google-shortcuts:1.0.0")
}

Dynamiczny

dependencies {
    implementation "androidx.core:core:1.6.0"
    implementation 'androidx.core:core-google-shortcuts:1.0.0'
}

Po dodaniu zależności biblioteki do projektu aplikacji na Androida aplikacja może używać metody pushDynamicShortcut() z ShortcutManagerCompat do przesyłania dynamicznych skrótów, które kwalifikują się do wyświetlania w programie uruchamiającym i na platformach Google.

Tworzenie przypiętych skrótów

W Androidzie 8.0 (poziom interfejsu API 26) i nowszych możesz tworzyć przypięte skróty. W przeciwieństwie do skrótów statycznych i dynamicznych przypięte skróty pojawiają się w obsługiwanych programach uruchamiających jako osobne ikony. Rysunek 1 przedstawia różnicę między tymi 2 rodzajami skrótów.

Aby przypiąć skrót do obsługiwanego programu uruchamiającego za pomocą aplikacji, wykonaj te czynności:

  1. Użyj isRequestPinShortcutSupported(), aby sprawdzić, czy domyślny program uruchamiający na urządzeniu obsługuje przypinanie skrótów w aplikacji.
  2. Utwórz obiekt ShortcutInfoCompat, który zawiera identyfikator, intencję i krótką etykietę skrótu. Jeśli skrót istnieje, użyj identyfikatora istniejącego skrótu. System automatycznie wyszukuje i przypina wszystkie inne informacje związane ze skrótem.

  3. Przypnij skrót do programu uruchamiającego urządzenia, wywołując requestPinShortcut(). Podczas tego procesu możesz przekazać obiekt PendingIntent, który powiadamia aplikację tylko wtedy, gdy skrót zostanie przypięty.

    Po przypięciu skrótu aplikacja może aktualizować jego zawartość za pomocą metody updateShortcuts(). Więcej informacji znajdziesz w artykule Aktualizowanie skrótów.

Poniższy fragment kodu pokazuje, jak utworzyć przypięty skrót:

if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {
    // Enable the existing shortcut with the ID "my-shortcut".
    val pinShortcutInfo = ShortcutInfoCompat.Builder(context, "my-shortcut")
        .setShortLabel("Website")
        .setIntent(
            Intent(
                Intent.ACTION_VIEW,
                Uri.parse("https://www.mysite.example.com/")
            )
        )
        .build()

    // Create the PendingIntent object only if your app needs to be notified
    // that the user let the shortcut be pinned. If the pinning operation fails,
    // your app isn't notified. Assume here that the app implements a method
    // called createShortcutResultIntent() that returns a broadcast intent.
    val pinnedShortcutCallbackIntent =
        ShortcutManagerCompat.createShortcutResultIntent(context, pinShortcutInfo)

    // Configure the intent so that your app's broadcast receiver gets the
    // callback successfully. For details, see PendingIntent.getBroadcast().
    val successCallback = PendingIntent.getBroadcast(
        context, /* request code */ 0,
        pinnedShortcutCallbackIntent, /* flags */ PendingIntent.FLAG_IMMUTABLE
    )

    ShortcutManagerCompat.requestPinShortcut(
        context,
        pinShortcutInfo,
        successCallback.intentSender
    )
}

Tworzenie własnej aktywności skrótu

niestandardowe okno dialogowe z pytaniem „Czy chcesz dodać ikonę programu uruchamiającego Gmaila do ekranu głównego?” Opcje niestandardowe to „Nie, dziękuję” i „Dodaj ikonę”.
Rysunek 2. Przykład działania okna skrótu do aplikacji niestandardowej.

Możesz też utworzyć specjalną aktywność, która pomoże użytkownikom tworzyć skróty, wraz z opcjami niestandardowymi i przyciskiem potwierdzenia. Ilustracja 2 przedstawia przykład tego typu aktywności w aplikacji Gmail.

W pliku manifestu aplikacji dodaj ACTION_CREATE_SHORTCUT do elementu <intent-filter> aktywności. Ta deklaracja określa następujące zachowanie, gdy użytkownik próbuje utworzyć skrót:

  1. System uruchamia specjalistyczne działanie aplikacji.
  2. Użytkownik ustawia opcje skrótu.
  3. Użytkownik klika przycisk potwierdzenia.
  4. Aplikacja tworzy skrót za pomocą metody createShortcutResultIntent(). Ta metoda zwraca Intent, który Twoja aplikacja przekazuje z powrotem do wcześniej wykonywanej aktywności za pomocą setResult().
  5. Aplikacja wywołuje funkcję finish() w aktywności użytej do utworzenia spersonalizowanego skrótu.

Podobnie aplikacja może wyświetlać użytkownikom prośbę o dodanie przypiętych skrótów do ekranu głównego po instalacji lub pierwszym uruchomieniu aplikacji. Ta metoda jest skuteczna, ponieważ pomaga użytkownikom tworzyć skróty w ramach zwykłego procesu pracy.

Testowanie skrótów

Aby przetestować skróty aplikacji, zainstaluj ją na urządzeniu z launcherem, który obsługuje skróty. Następnie wykonaj te czynności:

  • Naciśnij i przytrzymaj ikonę programu uruchamiającego aplikacji, aby wyświetlić zdefiniowane przez siebie skróty.
  • Przeciągnij skrót, aby przypiąć go do programu uruchamiającego urządzenia.