ショートカットを作成する

ショートカットは、ユーザーがアプリの一部にすばやくアクセスできるようにすることで、特定の種類のコンテンツをユーザーに提供します。

アプリ ショートカットと固定されたショートカットのコントラスト
図 1. アプリ ショートカットと固定されたショートカット。

ショートカットでコンテンツを配信する方法は、ユースケースと、ショートカットのコンテキストがアプリ主導かユーザー主導かによって異なります。静的ショートカットのコンテキストは変化せず、動的ショートカットのコンテキストは常に変化しますが、どちらの場合もアプリがコンテキストを制御します。ユーザーがアプリからコンテンツを配信する方法(ピン留めされたショートカットなど)を選択する場合、コンテキストはユーザーによって定義されます。次のシナリオでは、各ショートカット タイプのユースケースをいくつか説明します。

  • 静的ショートカットは、ユーザーがアプリを操作している間、一貫した構造でコンテンツにリンクするアプリに最適です。ほとんどのランチャーでは一度に4 つのショートカットしか表示されないため、静的ショートカットは、ユーザーが特定の形式でカレンダーやメールを表示したい場合など、ルーチン タスクを一貫した方法で実行するのに便利です。
  • 動的ショートカットは、コンテキストに応じたアプリ内のアクションに使用されます。コンテキスト依存ショートカットは、ユーザーがアプリで行うアクションに合わせて調整されます。たとえば、起動時に現在のレベルから開始できるゲームを作成する場合、ショートカットを頻繁に更新する必要があります。動的ショートカットを使用すると、ユーザーがレベルをクリアするたびにショートカットを更新できます。
  • 固定されたショートカットは、ユーザー主導の特定のアクションに使用されます。たとえば、特定のウェブサイトをランチャーに固定したい場合などです。これは、ユーザーがブラウザのデフォルト インスタンスを使用するよりも速く、ウェブサイトへの移動などのカスタム アクションを 1 ステップで実行できるため、便利です。

静的ショートカットを作成する

静的ショートカットは、アプリ内の汎用アクションへのリンクを提供します。このアクションは、アプリの現在のバージョンのライフサイクル全体を通して一貫性を保つ必要があります。静的ショートカットの適切なオプションとしては、送信済みメッセージの表示、アラームの設定、ユーザーのその日のエクササイズ アクティビティの表示などがあります。

静的ショートカットを作成する手順は次のとおりです。

  1. アプリの AndroidManifest.xml ファイルで、インテント フィルタが android.intent.action.MAIN アクションと android.intent.category.LAUNCHER カテゴリに設定されているアクティビティを見つけます。
  2. アプリのショートカットが定義されているリソース ファイルを参照する <meta-data> 要素をこのアクティビティに追加します。

    <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. res/xml/shortcuts.xml という名前の新しいリソース ファイルを作成します。

  4. 新しいリソース ファイルに、<shortcut> 要素のリストを含む <shortcuts> ルート要素を追加します。各 <shortcut> 要素に、アイコン、説明ラベル、アプリ内で起動するインテントなど、静的ショートカットに関する情報を含めます。

    <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>

属性値をカスタマイズする

次のリストは、静的ショートカット内のさまざまな属性の説明です。android:shortcutId と android:shortcutShortLabel の値を指定します。その他の値はすべて省略可能です。

android:shortcutId

ShortcutManager オブジェクトが操作を実行する際のショートカットを表す文字列リテラル。

android:shortcutShortLabel

ショートカットの目的を説明する簡潔なフレーズ。可能な場合は、この短い説明を 10 文字以内に制限します。

詳細については、setShortLabel() をご覧ください。

android:shortcutLongLabel

ショートカットの目的を説明する長いフレーズ。十分なスペースがある場合、ランチャーは android:shortcutShortLabel ではなくこの値を表示します。可能な場合は、この長い説明を 25 文字以内に制限します。

詳細については、setLongLabel() をご覧ください。

android:shortcutDisabledMessage

ユーザーが無効なショートカットを起動しようとしたときに、サポートされているランチャーに表示されるメッセージ。メッセージでは、ショートカットが無効になっている理由をユーザーに説明する必要があります。android:enabled が true の場合、この属性の値は無効です。

android:enabled

サポートされているランチャーからユーザーがショートカットを操作できるかどうかを決定します。android:enabled のデフォルト値は true です。false に設定する場合は、ショートカットを無効にする理由を説明する android:shortcutDisabledMessage を設定します。このようなメッセージを提供する必要がないと思われる場合は、XML ファイルからショートカットを完全に削除してください。

android:icon

ランチャーがショートカットをユーザーに表示するときに使用するビットマップまたはアダプティブ アイコン。この値には、画像へのパスまたは画像を含むリソース ファイルを指定できます。パフォーマンスと一貫性を向上させるため、可能な限りアダプティブ アイコンを使用してください。

内部要素を設定する

アプリの静的ショートカットを一覧表示する XML ファイルでは、各 <shortcut> 要素内で次の要素がサポートされています。定義する静的ショートカットごとに intent 内部要素を含める必要があります。

intent

ユーザーがショートカットを選択したときにシステムが起動するアクション。このインテントでは、android:action 属性の値を指定する必要があります。

1 つのショートカットに複数のインテントを指定できます。詳しくは、複数のインテントとアクティビティを管理する、インテントを設定する、TaskStackBuilder クラスのリファレンスをご覧ください。

categories

アプリのショートカットが実行するアクションのタイプ(新しいチャット メッセージの作成など)のグループ化を提供します。

サポートされているショートカット カテゴリの一覧については、ShortcutInfo クラスのリファレンスをご覧ください。

capability-binding

ショートカットに関連付けられたケーパビリティを宣言します。

上記の例では、ショートカットは CREATE_MESSAGE 用に宣言されたケーパビリティにリンクされています。これは App Actionsの組み込みインテントです。このケーパビリティ バインディングにより、ユーザーは Google アシスタントで音声コマンドを使用してショートカットを呼び出すことができます。

動的ショートカットを作成する

動的ショートカットは、アプリ内のコンテキストに応じた特定のアクションへのリンクを提供します。このアクションは、アプリを使用するたびに、また、アプリの実行中でも変更できます。動的ショートカットのユースケースの良い例としては、特定の相手への通話発信、特定の場所へのナビゲーション、ユーザーの前回のセーブポイントからのゲームの読み込みなどがあります。また、動的ショートカットを使用して会話を開くこともできます。

ShortcutManagerCompat Jetpack ライブラリは、アプリの動的ショートカットを管理するための ShortcutManager API のヘルパーです。ShortcutManagerCompat ライブラリを使用すると、ボイラープレート コードを削減できるとともに、異なる Android バージョン間でのショートカットの動作を一貫させることができます。このライブラリは、動的ショートカットをプッシュして、Google Shortcuts Integration Library を使用して Google サーフェス(アシスタントなど)に表示できるようにする場合にも必要です。

ShortcutManagerCompat API を使用すると、アプリで動的ショートカットに対して次の操作を実行できます。

  • プッシュと更新: pushDynamicShortcut() を使用して、動的ショートカットを公開および更新します。同じ ID の動的ショートカットまたは固定ショートカットがすでに存在する場合、変更可能な各ショートカットが更新されます。
  • 削除: removeDynamicShortcuts() を使用して、動的ショートカットのセットを削除します。removeAllDynamicShortcuts() を使用して、すべての動的ショートカットを削除します。

ショートカットに対するオペレーションの実行の詳細については、ショートカットを管理すると ShortcutManagerCompat リファレンスをご覧ください。

動的ショートカットを作成してアプリに関連付ける例を次に示します。

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)

Google Shortcuts Integration Library を追加する

Google Shortcuts Integration Library は、オプションの Jetpack ライブラリです。ランチャーや Google サーフェスなど、Android サーフェスに表示できる動的ショートカットをプッシュできます。このライブラリを使用すると、ユーザーはアプリ内の特定のコンテンツにすばやくアクセスしたり、アクションをリプレイしたりするためのショートカットを見つけやすくなります。

このライブラリでプッシュされた動的ショートカットは、デバイスごとに適用されるショートカットの制限の対象外です。これにより、ユーザーがアプリで関連するアクションを完了するたびに、アプリがショートカットをプッシュできるようになります。頻繁に使用されるショートカットをこのようにプッシュすることで、Google はユーザーの使用パターンを把握し、状況的に関連性の高いショートカットをユーザーに提案できるようになります。

たとえば、フィットネス トラッキング アプリからプッシュされたショートカットから、ユーザーが通常毎朝ランニングしていることを学習し、ユーザーが朝にスマートフォンを手に取ったときに「ランニングを開始」ショートカットを事前に提案できます。

Google Shortcuts Integration Library 自体は、アドレス指定可能な機能を提供しません。このライブラリをアプリに追加すると、Google サーフェスは ShortcutManagerCompat を使用してアプリがプッシュするショートカットを取り込むことができます。

アプリでこのライブラリを使用するには、app/build.gradle ファイルまたは app/build.gradle.kts ファイルに Google ショートカット統合ライブラリと ShortcutManagerCompat の依存関係を追加します。

Kotlin

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

Groovy

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

ライブラリの依存関係を Android プロジェクトに追加すると、アプリは ShortcutManagerCompat の pushDynamicShortcut() メソッドを使用して、ランチャーと参加している Google サーフェスに表示できる動的ショートカットをプッシュできます。

固定ショートカットを作成する

Android 8.0(API レベル 26)以降では、固定されたショートカットを作成できます。静的ショートカットや動的ショートカットとは異なり、固定ショートカットは、サポートされているランチャーで個別のアイコンとして表示されます。図 1 は、この 2 種類のショートカットの違いを示しています。

アプリを使用してサポートされているランチャーにショートカットを固定するには、次の手順を行います。

  1. isRequestPinShortcutSupported() を使用して、デバイスのデフォルト ランチャーがショートカットのアプリ内固定をサポートしていることを確認します。
  2. ショートカットの ID、インテント、短いラベルを含む ShortcutInfoCompat オブジェクトを作成します。ショートカットが存在する場合は、既存のショートカットの ID を使用します。システムは、ショートカットに関連する他のすべての情報を自動的に検索して固定します。

  3. requestPinShortcut() を呼び出して、ショートカットをデバイスのランチャーに固定します。このプロセスでは、PendingIntent オブジェクトを渡すことができます。このオブジェクトは、ショートカットが正常に固定された場合にのみアプリに通知します。

    ショートカットが固定された後、アプリは updateShortcuts() メソッドを使用してコンテンツを更新できます。詳しくは、ショートカットを更新するをご覧ください。

次のコード スニペットは、固定されたショートカットを作成する方法を示しています。

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
    )
}

カスタム ショートカット アクティビティを作成する

「Gmail ランチャー アイコンをホーム画面に追加しますか?」というプロンプトを表示するカスタム ダイアログ アクティビティ。カスタム オプションは [No thanks] と [Add icon] です。
図 2. カスタム アプリ ショートカット ダイアログ アクティビティの例。

ユーザーがショートカットを作成するのに役立つ専用のアクティビティを作成することもできます。このアクティビティには、カスタム オプションと確認ボタンが用意されています。図 2 は、Gmail アプリでのこのタイプのアクティビティの例を示しています。

アプリのマニフェスト ファイルで、アクティビティの <intent-filter> 要素に ACTION_CREATE_SHORTCUT を追加します。この宣言により、ユーザーがショートカットを作成しようとしたときに、次の動作が設定されます。

  1. システムがアプリの専用アクティビティを起動します。
  2. ユーザーがショートカットのオプションを設定します。
  3. ユーザーが確認ボタンを選択します。
  4. アプリは createShortcutResultIntent() メソッドを使用してショートカットを作成します。このメソッドは Intent を返します。アプリは setResult() を使用して、以前に実行していたアクティビティにこの値をリレーします。
  5. アプリは、カスタマイズされたショートカットの作成に使用されるアクティビティで finish() を呼び出します。

同様に、アプリのインストール後または初回起動時に、固定ショートカットをホーム画面に追加するようユーザーに促すことができます。この方法は、ユーザーが通常のワークフローの一環としてショートカットを作成できるため、効果的です。

ショートカットをテストする

アプリのショートカットをテストするには、ショートカットをサポートするランチャーを備えたデバイスにアプリをインストールします。次の操作を行います。

  • アプリのランチャー アイコンを長押しすると、アプリ用に定義したショートカットが表示されます。
  • ショートカットをドラッグして、デバイスのランチャーに固定します。