💭

Androidのショートカット実装

2023/01/24に公開

ショートカット

アプリのランチャーアイコンを長押しすると、出てくるアレですね。
業務中にちょっと話に出て、そういえば実装方法知らなかったので実装してみました。
公式サイトでも説明があるので、基本はこの通りに実装しました。

ショートカットの種類

ショートカットには「静的ショートカット」「動的ショートカット」「固定ショートカット」があるようです。
詳しくは前述のページに書いてありますが、簡単に実装を試すだけでいいので、今回は「静的ショートカット」を実装します。

静的ショートカットの実装

主にやることは3つ。

  1. AndroidManifest.xmlに<meta-data>タグを追加
  2. ショートカットの内容を定義するxmlファイルを作成
  3. ショートカットの内容を実装

AndroidManifest.xml

マニフェストには、<intent-filter>にandroid.intent.action.MAINアクションandroid.intent.category.LAUNCHERカテゴリが設定されてるActivityがあると思うので、その<activity>内に以下のように<meta-data>タグを追加します。

 <activity
    android:name=".MainActivity"
    android:exported="true"
    android:label="@string/app_name"
    android:theme="@style/Theme.Studyapp">
    <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>

shortcuts.xml

次に、実際のショートカットの内容は新しくxmlを作成します。

 <?xml version="1.0" encoding="utf-8"?>
 <shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:icon="@drawable/lucci"
        android:shortcutId="shortcut_test"
        android:shortcutShortLabel="@string/shortcut">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.example.study_app"
            android:targetClass="com.example.study_app.MainActivity" />
    </shortcut>

    <shortcut
        android:icon="@drawable/ic_100tb"
        android:shortcutId="shortcut_test2"
        android:shortcutShortLabel="@string/shortcut2">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.example.study_app"
            android:targetClass="com.example.study_app.MainActivity">
            <extra android:name="shortcut" android:value="photo_picker" />
        </intent>
    </shortcut>

    <shortcut
        android:icon="@drawable/ic_launcher_background"
        android:shortcutId="shortcut_test3"
        android:shortcutShortLabel="@string/shortcut3">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.example.study_app"
            android:targetClass="com.example.study_app.MainActivity">
            <extra android:name="shortcut" android:value="zoom_image" />
        </intent>
    </shortcut>
 </shortcuts>

<shortcut>タグを増やせば、ショートカットが増えますが、ほとんどのランチャーは一度に4つのショートカットしか表示できないようです。

その他の設定の概要は以下の通りです。

  • android:icon -> ランチャーがショートカットをユーザーに表示するときに使用する
  • android:shortcutShortLabel -> ショートカットの目的を説明する短い説明

また、<shortcut>タグ内に<intent>を記載することで、ショートカットをタップした時の起動画面を指定します。さらに<extra>タグでパラメータも渡せるので任意の画面に遷移させたい場合などに使えそうです。
コード内で<extra>タグの内容を取得するには以下で取得出来ます。

 val shortcutExtra = intent.getStringExtra("shortcut") ?: ""

実際にショートカットを表示させると以下のようになります。

ちなみに、試してませんがandroid:enabledで制御すればdebugビルドの時だけショートカットを有効とかも出来そうなので、今度実践してみよう。

Discussion