ショートカットを使用すると、ユーザーがアプリの一部にすばやくアクセスできるようになり、特定の種類のコンテンツをユーザーに提供できます。
ショートカットを使用してコンテンツを配信する方法は、ユースケースと、ショートカットのコンテキストがアプリドリブンかユーザードリブンかによって異なります。静的ショートカットのコンテキストは変化せず、動的ショートカットのコンテキストは常に変化しますが、どちらの場合もアプリがコンテキストを駆動します。ユーザーがアプリからコンテンツを配信する方法を選択する場合(固定ショートカットなど)、コンテキストはユーザーによって定義されます。以下のシナリオでは、各ショートカット タイプのユースケースをいくつか説明します。
- 静的ショートカットは、ユーザーがアプリを操作する期間全体を通じて一貫した構造を使用してコンテンツにリンクするアプリに最適です。ほとんどのランチャーは一度に 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という名前の新しいリソース ファイルを作成します。新しいリソース ファイルに、
<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: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ショートカットにリンクされたケーパビリティを宣言します。
上記の例では、ショートカットは
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 ライブラリです。これにより、ランチャーなどの Android サーフェスや Google サーフェスに表示できる動的ショートカットをプッシュできます。このライブラリを使用すると、ユーザーはショートカットを見つけて、アプリ内の特定のコンテンツにすばやくアクセスしたり、アクションをリプレイしたりできます。
このライブラリでプッシュされた動的ショートカットは、デバイスごとに適用されるショートカットの上限の対象になりません。これにより、ユーザーがアプリで関連するアクションを完了するたびに、アプリがショートカットをプッシュできるようになります。このように頻繁にショートカットをプッシュすることで、Google はユーザーの使用パターンを把握し、状況的に関連性の高いショートカットをユーザーに提案できるようになります。
たとえば、アシスタントは、フィットネス トラッキング アプリからプッシュされたショートカットから、ユーザーが通常毎朝ランニングしていることを学習し、ユーザーが朝にスマートフォンを手に取ったときに「ランニングを開始」ショートカットを事前に提案できます。
Google Shortcuts Integration Library 自体には、アドレス指定可能な機能はありません。このライブラリをアプリに追加すると、Google サーフェスは、アプリが ShortcutManagerCompat を使用してプッシュするショートカットを取り込むことができます。
アプリでこのライブラリを使用するには、Google ショートカット統合ライブラリと ShortcutManagerCompat の依存関係を app/build.gradle ファイルまたは app/build.gradle.kts ファイルに追加します。
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 種類のショートカットの違いを示しています。
アプリを使用して、サポートされているランチャーにショートカットを固定する手順は次のとおりです。
isRequestPinShortcutSupported()を使用して、デバイスのデフォルト ランチャーがショートカットのアプリ固定をサポートしていることを確認します。ShortcutInfoCompatオブジェクトを作成します。このオブジェクトには、ショートカットの ID、インテント、短いラベルが含まれます。ショートカットが存在する場合は、既存のショートカットの ID を使用します。システムは、ショートカットに関連する他のすべての情報を自動的に見つけて固定します。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 ) }
カスタム ショートカット アクティビティを作成する
また、ユーザーがショートカットを作成するのに役立つ、カスタム オプションと確認ボタンを備えた専用のアクティビティを作成することもできます。図 2 は、Gmail アプリでのこのタイプのアクティビティの例を示しています。
アプリのマニフェスト ファイルで、アクティビティの <intent-filter> 要素に ACTION_CREATE_SHORTCUT を追加します。この宣言により、ユーザーがショートカットを作成しようとしたときに、次の動作が設定されます。
- システムがアプリの専用アクティビティを起動します。
- ユーザーがショートカットのオプションを設定します。
- ユーザーが確認ボタンを選択します。
- アプリは
createShortcutResultIntent()メソッドを使用してショートカットを作成します。このメソッドはIntentを返します。アプリはsetResult()を使用して、以前に実行していたアクティビティにこれをリレーします。 - アプリは、カスタマイズされたショートカットの作成に使用されるアクティビティで
finish()を呼び出します。
同様に、アプリのインストール後または初回起動時に、固定ショートカットをホーム画面に追加するようユーザーに求めることもできます。この方法は、ユーザーが通常のワークフローの一部としてショートカットを作成できるため、効果的です。
ショートカットをテストする
アプリのショートカットをテストするには、ショートカットをサポートするランチャーを搭載したデバイスにアプリをインストールします。次に、以下の操作を行います。
- アプリのランチャー アイコンを長押しすると、アプリに定義したショートカットが表示されます。
- ショートカットをドラッグして、デバイスのランチャーに固定します。