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

ショートカットを使用すると、アプリの各部分にすばやくアクセスして、特定の種類のコンテンツをユーザーに提供できます。

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

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

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

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

静的ショートカットはアプリ内の汎用的なアクションへのリンクを提供します。これらのアクションは、アプリの現在のバージョンの全期間を通じて一貫している必要があります。静的ショートカットとしては、送信済みメッセージの表示、アラームの設定、ユーザーの 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.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" />
          <capability-binding android:key="actions.intent.CREATE_MESSAGE" />
        </shortcut>
        <!-- Specify more shortcuts here. -->
      </shortcuts>
      

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

次のリストでは、静的ショートカット内の各属性について説明します。android:shortcutIdandroid:shortcutShortLabel の値を指定します。その他の値はすべて省略可能です。

android:shortcutId

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

android:shortcutShortLabel

ショートカットの目的を説明する簡潔なフレーズ。可能であれば、この簡単な説明は半角 10 文字(全角 5 文字)以内にしてください。

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

android:shortcutLongLabel

ショートカットの目的を説明する詳細なフレーズ。十分なスペースがある場合、ランチャーは android:shortcutShortLabel ではなくこの値を表示します。可能であれば、この詳しい説明文は半角 25 文字(全角 12 文字)以内にしてください。

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

android:shortcutDisabledMessage

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

android:enabled

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

android:icon

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

内部要素を設定する

アプリの静的ショートカットをリストする XML ファイルは、各 <shortcut> 要素内で以下の要素をサポートします。定義した静的ショートカットごとに intent 内部要素を含める必要があります

intent

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

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

categories

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

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

capability-binding

ショートカットにリンクされている機能を宣言します。

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

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

動的ショートカットは、アプリ内のコンテキストを反映した特定のアクションへのリンクを提供します。これらのアクションは、アプリの使用時と実行中のアプリの間で異なる場合があります。動的ショートカットの便利な使い方には、特定の人物への発信、特定の場所への移動、ユーザーの最後のセーブポイントからのゲームの読み込みなどがあります。動的ショートカットを使用して会話を開くこともできます。

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

ShortcutManagerCompat API を使用すると、アプリは動的ショートカットを使用して次のオペレーションを実行できます。

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

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

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

Kotlin


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)

Java


ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(context, "id1")
    .setShortLabel("Website")
    .setLongLabel("Open the website")
    .setIcon(IconCompat.createWithResource(context, R.drawable.icon_website))
    .setIntent(new 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 ライブラリです。ランチャーなどの Android サーフェス、およびアシスタントなどの Google サーフェスに表示できる動的ショートカットをプッシュできます。このライブラリを使用すると、ユーザーはショートカットを見つけて、アプリ内の特定のコンテンツにすばやくアクセスしたり、アクションを再生したりできます。

たとえば、メッセージ アプリは、ユーザーが「Alex」という名前の連絡先にメッセージを送信した後に、その連絡先の動的ショートカットをプッシュします。動的ショートカットがプッシュされた後、ユーザーがアシスタントに「OK Google, ExampleApp でアレックスにメッセージを送信して」と言えば、アシスタントは ExampleApp を起動して Alex にメッセージを送信するように自動的に構成できます。

このライブラリでプッシュされた動的ショートカットには、デバイスごとに適用されるショートカット制限は適用されません。これにより、ユーザーがアプリで関連する操作を完了するたびに、アプリはショートカットをプッシュできます。このように頻繁にショートカットをプッシュすることで、Google はユーザーの使用パターンを理解し、状況に応じた適切なショートカットを提案できます。

たとえば、アシスタントは、ユーザーが毎朝通常実行するフィットネス トラッキング アプリからプッシュされたショートカットを学習し、ユーザーが朝スマートフォンを持ち上げたときに「ランニングを開始」のショートカットを積極的に提案します。

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

アプリでこのライブラリを使用する手順は次のとおりです。

  1. AndroidX ライブラリをサポートするように gradle.properties ファイルを更新します。

          
          android.useAndroidX=true
          # Automatically convert third-party libraries to use AndroidX
          android.enableJetifier=true
          
          
  2. app/build.gradle で、Google Shortcuts Integration Library と ShortcutManagerCompat の依存関係を追加します。

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

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

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

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

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

  1. isRequestPinShortcutSupported() を使用して、デバイスのデフォルト ランチャーがショートカットのアプリ内固定をサポートしていることを確認します。
  2. ショートカットが存在するかどうかに応じて、次のいずれかの方法で ShortcutInfo オブジェクトを作成します。

    1. ショートカットが存在する場合は、既存のショートカットの ID のみを含む ShortcutInfo オブジェクトを作成します。ショートカットに関連するその他の情報はすべて、自動的に検出されて固定されます。
    2. 新しいショートカットを固定する場合は、新しいショートカットの ID、インテント、短いラベルを含む ShortcutInfo オブジェクトを作成します。
  3. requestPinShortcut() を呼び出して、ショートカットをデバイスのランチャーに固定します。 このプロセス中に、PendingIntent オブジェクトを渡すことができます。このオブジェクトは、ショートカットが正常に固定された場合にのみアプリに通知します。

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

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

Kotlin

val shortcutManager = getSystemService(ShortcutManager::class.java)

if (shortcutManager!!.isRequestPinShortcutSupported) {
    // Enable the existing shortcut with the ID "my-shortcut".
    val pinShortcutInfo = ShortcutInfo.Builder(context, "my-shortcut").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 = shortcutManager.createShortcutResultIntent(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 */ 0)

    shortcutManager.requestPinShortcut(pinShortcutInfo,
            successCallback.intentSender)
}

Java

ShortcutManager shortcutManager =
        context.getSystemService(ShortcutManager.class);

if (shortcutManager.isRequestPinShortcutSupported()) {
    // Enable the existing shortcut with the ID "my-shortcut".
    ShortcutInfo pinShortcutInfo =
            new ShortcutInfo.Builder(context, "my-shortcut").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.
    Intent pinnedShortcutCallbackIntent =
            shortcutManager.createShortcutResultIntent(pinShortcutInfo);

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

    shortcutManager.requestPinShortcut(pinShortcutInfo,
            successCallback.getIntentSender());
}

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

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

カスタム オプションや確認ボタンを備えたショートカットをユーザーが作成できるように、特別なアクティビティを作成することもできます。図 2 は、Gmail アプリでのこのタイプのアクティビティの例を示しています。

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

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

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

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

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

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