ショートカットは、ユーザーがアプリの要素にすばやくアクセスできる方法で、特定の種類のコンテンツを提供します。
ショートカットでコンテンツを提供する方法は、ユースケースと、ショートカットのコンテキストがアプリ主導かユーザー主導かによって異なります。静的ショートカットのコンテキストは不変であり、動的ショートカットのコンテキストは常に変化しますが、どちらの場合もコンテキストはアプリ主導で決まります。固定ショートカットのようにユーザーがアプリのコンテンツ提供方法を選択する場合、コンテキストはユーザー主導で決まります。ショートカットの種類ごとにユースケースをいくつか示します。
- 静的ショートカットは、ユーザーがアプリを操作している間、 一貫した構造でコンテンツにリンクするアプリに最適です。 ほとんどのランチャーは一度に4 つのショートカットしか表示できないため、 静的ショートカットは、ユーザーが特定の形式でカレンダーやメールを表示したい場合など、ルーチン タスクを一貫して実行するのに 便利です。
- 動的ショートカットは、 コンテキスト依存のアプリのアクションに使用されます。コンテキスト依存のショートカットは、アプリ内でユーザーが行うアクションに合わせて調整されます。たとえば、ユーザーがゲームを起動したときに現在のレベルから開始できるゲームを作成する場合、ショートカットを頻繁に更新する必要があります。動的ショートカットを使用すると、ユーザーがレベルをクリアするたびにショートカットを更新できます。
- 固定ショートカットは、特定のユーザー主導アクションに使用されます。たとえば、特定のウェブサイトをランチャーに固定する場合などです。これは、ユーザーがカスタム アクションを実行できるようになるため、便利です。たとえば、ブラウザのデフォルト インスタンスを使用するより迅速に、ワンステップでウェブサイトに移動できます。
静的ショートカットを作成する
静的ショートカットは、アプリ内の一般的なアクションへのリンクを提供します。こうしたアクションは、アプリの現行バージョンの存続期間を通して一貫性を保つ必要があります。静的ショートカットの適切な使用方法としては、送信済みメッセージの表示、アラームの設定、ユーザーの 1 日の運動状況の表示などがあります。
静的ショートカットを作成する手順は次のとおりです。
- アプリの
AndroidManifest.xmlファイルで、インテント フィルタがandroid.intent.action.MAINアクションとandroid.intent.category.LAUNCHERカテゴリに設定されているアクティビティを見つけます。 次のように、アプリのショートカットが定義されているリソース ファイルを参照する
<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>res/xml/shortcuts.xmlという名前の新しいリソース ファイルを作成します。新しいリソース ファイルに、
<shortcuts>ルート要素と、<shortcut>要素のリストを含む を追加します。各<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:shortcutIdShortcutManagerオブジェクトがオペレーションを実行するときのショートカットを表す文字列リテラル。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ショートカットにリンクされたケーパビリティを宣言します。
上記の例では、(App Actions 組み込みインテントの一つ)
CREATE_MESSAGEに対して宣言したケーパビリティにショートカットをリンクしています。このケーパビリティ バインディングを加えるだけで、ユーザーは 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 ライブラリです。これを使用することで、Android サーフェス(ランチャーなど)と Google サーフェスの両方に表示可能な動的ショートカットをプッシュできるようになります。このライブラリを使用すると、ユーザーがショートカットを容易に見つけて、アプリ内の特定コンテンツへのアクセスや、アクションの再実行をすばやく行えるようにできます。
このライブラリでプッシュされる動的ショートカットは、デバイス単位で適用される ショートカットの制限の対象ではありません。これにより、ユーザーがアプリで関連付けられたアクションを完了するたびに、アプリがショートカットをプッシュできます。この方法でショートカットを頻繁にプッシュすることで、Google がユーザーの使用パターンを把握し、状況に応じたショートカットを提案できるようになります。
たとえば、フィットネス トラッキング アプリがプッシュしたショートカットから、アシスタントはユーザーが毎朝ランニングに行くことを学習できるかもしれません。その場合、アシスタントはユーザーが朝スマートフォンを手に取ると、「ランニングを始める」ショートカットを能動的に提案するようになります。
Google Shortcuts Integration Library は、アドレス可能な機能そのものは提供しません。このライブラリをアプリに追加することにより、ShortcutManagerCompat でプッシュしたショートカットを Google サーフェスが取り込めるようになります。
アプリでこのライブラリを使用する手順は次のとおりです。
AndroidX ライブラリをサポートするため、次のように
gradle.propertiesファイルを更新します。android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=trueapp/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 プロジェクトに追加したライブラリ依存関係により、アプリは ShortcutManagerCompat の pushDynamicShortcut() メソッドを使用して、ランチャーや登録された Google サーフェスに表示可能な動的ショートカットをプッシュできるようになります。
固定ショートカットを作成する
Android 8.0(API レベル 26)以降では、固定ショートカットを作成できます。 固定ショートカットは、静的ショートカットや動的ショートカットとは異なり、サポートされているランチャーに個別のアイコンとして表示されます。図 1 に、2 種類のショートカットの違いを示します。
アプリを使用して、サポートされているランチャーにショートカットを固定する手順は次のとおりです。
isRequestPinShortcutSupported()を使用して、デバイスの デフォルト ランチャーがショートカットのアプリ内固定をサポートしていることを確認します。ショートカットが存在するかどうかに応じて、次のいずれかの方法で
ShortcutInfoオブジェクトを作成します。- ショートカットが存在する場合は、既存のショートカットの ID のみを含む
ShortcutInfoオブジェクトを作成します。ショートカットに関連するその他の情報はすべてシステムにより自動的に検出され、固定されます。 - 新しいショートカットを固定する場合は、新しいショートカットの ID、インテント、短いラベルを含む
ShortcutInfoオブジェクトを作成します。
- ショートカットが存在する場合は、既存のショートカットの ID のみを含む
`requestPinShortcut()` を呼び出してショートカットをデバイスのランチャーに固定します
requestPinShortcut(). このプロセス中に、PendingIntentオブジェクトを渡すことができます。このオブジェクトは、ショートカットが 正常に固定された場合にのみアプリに通知します。ショートカットが固定されたら、アプリは
updateShortcuts()メソッドを使用してコンテンツを更新できます。詳しくは、ショートカットを 更新するをご覧ください。
次のコード スニペットは、固定ショートカットを作成する方法を示しています。
val shortcutManager = getSystemService<ShortcutManager>()
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)
}
カスタム ショートカット アクティビティを作成する
カスタム オプションと確認ボタンを備えたショートカットを作成する際に役立つ、特別なアクティビティを作成することもできます。図 2 は、Gmail アプリにおけるそのようなアクティビティの例を示しています。
アプリのマニフェスト ファイルで、ACTION_CREATE_SHORTCUT を
アクティビティの <intent-filter> 要素に追加します。この宣言により、ユーザーがショートカットを作成しようとしたとき、次の動作が設定されます。
- システムがアプリの特別なアクティビティを開始します。
- ユーザーがショートカットのオプションを設定します。
- ユーザーが確認ボタンを選択します。
- アプリは
createShortcutResultIntent()メソッドを使用してショートカットを作成します。このメソッドはIntentを返します。アプリは、setResult()で 以前実行したアクティビティに、これを送り返します。 - アプリは、カスタマイズされたショートカットの作成に使用されたアクティビティで、
finish()を呼び出します。
同様に、アプリがインストールされたとき、または初めて起動されたときに、固定ショートカットをホーム画面に追加するようユーザーにリクエストするメッセージを表示することもできます。この方法は、通常のワークフローの一環としてショートカットの作成をユーザーに促すため、効果的です。
ショートカットをテストする
アプリのショートカットをテストするには、ショートカットをサポートするランチャーを備えたデバイスにアプリをインストールします。次に、次の操作を行います。
- アプリのランチャー アイコンを長押しして、アプリに定義したショートカットを表示します。
- ショートカットをドラッグして、デバイスのランチャーに固定します。