この記事では、アプリケーションのショートカットを作成および管理する方法と、アプリケーションのデスクトップ ウィジェットを作成および管理する方法を紹介します。
目次
1.デスクトップメニュー
1.1 概要
開発者は、アプリ内で特定のアクションを実行するためのショートカットを定義できます。
これらのショートカットは、サポートされているランチャーや Google アシスタントなどのアシスタントに表示され、ユーザーがアプリ内で一般的なタスクや推奨されるタスクをすばやく起動できるようになります。
この記事では、ショートカットのパフォーマンスを向上させるためのベスト プラクティスについても学びます。
1.2. デスクトップ アイコンのショートカット メニューが必要なのはなぜですか?
Android デバイスでは、デスクトップ アイコンの名前変更、アンインストール、アプリケーション情報などのクイック操作をショートカット メニューから実行できます。
Android デスクトップ アイコンのショートカット メニューを開いて使用する手順は次のとおりです。
-
アイコンを長押しする: ホーム画面でアプリのアイコンが浮き上がるか大きくなるまで長押しします。
-
ショートカット メニューを開く: アイコンがフロートし始めると、いくつかのアクション オプションがアイコンの周囲にフローティングするか、下部に表示されます。
-
操作の選択: 実行したい操作に応じて、ショートカット メニューから対応するオプションを選択します。
写真が示すように、
ショートカットを使用すると、ユーザーがアプリの特定の部分にすばやくアクセスし、特定の種類のコンテンツを表示できるようになります。
- 静的ショートカットは、
ユーザーがアプリを操作する全期間にわたって一貫した構造を使用してコンテンツにリンクするアプリに最適です。ほとんどのランチャーは一度に 4 つのショートカットしか表示できないため、静的ショートカットは一般的なアクティビティに役立ちます。たとえば、ユーザーがカレンダーや電子メールを特定の方法で表示したい場合、静的ショートカットを使用すると、日常のタスクを実行する際に常に一貫したエクスペリエンスが得られます。 - 動的ショートカットは、
アプリ内のコンテキスト依存アクションに使用されます。コンテキスト依存のショートカットは、アプリ内でユーザーが実行するアクションに合わせて調整されます。たとえば、起動時にユーザーが現在のレベルから開始できるゲームを構築している場合、そのショートカットを頻繁に更新する必要があります。動的ショートカットを使用すると、ユーザーがレベルをプレイするたびにゲームでショートカットを更新できます。 - 固定ショートカット
- ユーザー主導の特定のアクションの場合。たとえば、ユーザーは特定の Web サイトをランチャーに固定する必要がある場合があります。これは、ユーザーがブラウザのデフォルト インスタンスを使用するよりも速く、Web サイトへの移動などのカスタム アクションを 1 ステップで実行できるため便利です。
1.3. デスクトップアイコンのショートカットメニューを実現する方法
1.3.1 静的ショートカットの作成
静的ショートカットは、アプリ内の一般的なアクションへのリンクを提供します。このリンクは、アプリの現在のバージョンが存続するまで一貫性を保つ必要があります。
手順は次のとおりです。
- 新しいリソース ファイルを作成します:desk_menu.xml
res の下に新しい xml フォルダーを作成し、その xml フォルダーの下に新しいdesk_menu.xml ファイルを作成します。 - ショートカットメニューリストの追加、アイコンの設定、アドレスのジャンプなどを行います。
<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>
-
アプリのメイン ページを見つけます。つまり、アプリケーション マニフェスト ファイル (AndroidManifest.xml) で、インテント フィルターが android.intent.action.MAIN オペレーションと android.intent.category.LAUNCHER カテゴリ アクティビティに設定されています。
-
次のように要素を追加します:
< meta-data android:name="android.app.shortcuts"
android:resource="@xml/desk_menu" />
<!-- 主页 -->
<activity
android:name=".ui.HomeActivity"
android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize"
android:hardwareAccelerated="true"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustNothing"
android:theme="@style/HomeTheme">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="android.app.shortcuts"
android:resource="@xml/desk_menu" />
</activity>
- プロパティの説明
- android:shortcutId
は必須であり、通常の文字のみを使用できます。この属性の値をリソース文字列 (@string/foo など) として設定してはなりません。 - android:shortcutShortLabel は
必須です。これは、ショートカットの目的を簡単に説明するために使用されるフレーズです。
この属性の値は、@string/shortcut_short_labelなどのリソース文字列である必要があります。 - android:shortcutLongLabel は
オプションで、ショートカットの目的を指定するために使用されるフレーズです。スペースが十分に大きい場合、ランチャーは android:shortcutShortLabel の代わりにこの値を表示します。可能であれば、ショートカットの「詳細」の長さを 25 文字に制限してください。
この属性の値は、@string/shortcut_short_labelなどのリソース文字列である必要があります。 - android:shortcutDisabledMessage
オプション。これは、ユーザーが無効なショートカットを起動しようとしたときに、サポートされているランチャーに表示されるメッセージです。このメッセージは、ショートカットが現在無効になっている理由をユーザーに説明する必要があります。android:enabled が true の場合、この属性の値は無効であり、
この属性の値は@string/shortcut_short_labelなどのリソース文字列である必要があります。 - android:enabled
オプション。これは、ユーザーがサポートされているランチャーのショートカットを操作できるかどうかを決定するために使用されます。android:enabled のデフォルト値は true です。
これを false に設定した場合は、ショートカットが無効になっている理由を示すandroid:shortcutDisabledMessage も設定する必要があります。このようなメッセージを提供する必要がないと思われる場合、最も簡単な方法は、XML ファイルからショートカットを完全に削除することです。 - android:icon
オプション。これは、ランチャーがユーザーにショートカットを表示するために使用するビットマップまたはアダプティブ アイコンです。この値は、画像へのパス、または画像を含むリソース ファイルです。パフォーマンスと一貫性を向上させるために、可能な限りアダプティブ アイコンを使用してください。
- android:shortcutId
1.3.2 動的ショートカットの作成
動的ショートカットは、アプリ内の特定のコンテキスト依存アクションへのリンクを提供します。これらの操作は、アプリケーションの異なる使用シナリオ間で変化する可能性があり、さらにはアプリケーションの実行中にも変化する可能性があります。
動的ショートカットの適切な使用例には、特定の人に電話する、特定の場所に移動する、ユーザーの最後のセーブ ポイントからゲームをロードするなどがあります。動的なショートカットを使用して会話を開くこともできます。
手順は次のとおりです。
- Google ショートカット統合ライブラリと ShortcutManagerCompat の依存関係を追加する
dependencies {
implementation "androidx.core:core:1.6.0"
implementation 'androidx.core:core-google-shortcuts:1.0.0'
...
}
- AndroidX ライブラリをサポートするように gradle.properties ファイルを更新します。
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
- コーディング
ShortcutInfo 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);
プッシュと更新:pushDynamicShortcut() を使用して、動的ショートカットを公開および更新します。同じ ID を持つ動的ショートカットまたは固定ショートカットがすでに存在する場合、各変数ショートカットは更新されます。
削除: 動的ショートカットのグループを削除するには、removeDynamicShortcuts() を使用します。すべての動的ショートカットを削除するには、removeAllDynamicShortcuts() を使用します。
ショートカットでアクションを実行する方法の詳細については、「ショートカットの管理」および「ShortcutManagerCompat」リファレンス ドキュメントを参照してください。
1.3.3 固定ショートカットの作成
Android 8.0 (API レベル 26) 以降では、固定ショートカットを作成できます。静的ショートカットや動的ショートカットとは異なり、固定されたショートカットは、サポートされているランチャーに別のアイコンとして表示されます。図 1 は、これら 2 種類のショートカットの違いを示しています。
以下に示すように、
注: サポートされているランチャーにショートカットを固定しようとすると、ショートカットを固定する許可を求める確認ダイアログがユーザーに表示されます。ユーザーがショートカットの固定を許可しない場合、ランチャーはリクエストをキャンセルします。
**isRequestPinShortcutSupported()** を使用して、デバイスのデフォルトのランチャーがアプリ内ピン ショートカットをサポートしているかどうかを確認できます。
サポートされている場合は、次の手順に従って固定メソッドを追加します。
ShortcutManager shortcutManager =
context.getSystemService(ShortcutManager.class);
if (shortcutManager.isRequestPinShortcutSupported()) {
// Assumes there's already a shortcut with the ID "my-shortcut".
// The shortcut must be enabled.
ShortcutInfo pinShortcutInfo =
new ShortcutInfo.Builder(context, "my-shortcut").build();
// Create the PendingIntent object only if your app needs to be notified
// that the user allowed the shortcut to be pinned. Note that, if the
// pinning operation fails, your app isn't notified. We assume here that the
// app has implemented 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());
}
ショートカットが固定された後、アプリは updateShortcuts() メソッドを使用してコンテンツを更新できます。
1.3.4 ショートカットを使用するためのベスト プラクティス
アプリのショートカットを設計および作成するときは、次のガイドラインに従ってください。
-
デザイン ガイドラインに従う
アプリのショートカットをシステム アプリのショートカットと視覚的に一致させるには、アプリのショートカットのデザイン ガイドラインに従ってください。 -
4 つの異なるショートカットのみを公開する
API では現在、アプリに対して同時に最大 15 個の静的および動的ショートカットの公開をサポートしていますが、ランチャーの外観での視認性を向上させるために、4 つの異なるショートカットのみを公開することをお勧めします。
ランチャーにショートカットを表示するだけでなく、Google ショートカット統合ライブラリを使用して、Google Surface (Google アシスタントなど) にショートカットを表示することもできます。このライブラリは、任意の数の動的ショートカットのプッシュをサポートします。このライブラリで多くのショートカットをプッシュする場合は、setRank() メソッドを呼び出して、サポートされているランチャーに表示されるショートカットの「ランク」を設定することをお勧めします。
- ショートカットの説明の長さを制限する
ランチャー メニューにアプリのショートカットを表示できるスペースは限られています。可能な限り、ショートカットの短い説明は 10 文字、長い説明は 25 文字に制限してください。
静的ショートカットのラベルの詳細については、「カスタム属性値」を参照してください。動的ショートカットと固定ショートカットについては、setLongLabel() および setShortLabel() のリファレンス ドキュメントを参照してください。
-
ショートカットとアクションの使用記録を保持する
作成するショートカットごとに、ユーザーがアプリ内で直接同じタスクを実行できるさまざまな方法を検討してください。ランチャーがユーザーがショートカットで表されるアクションを実行する頻度を正確に記録できるように、毎回必ず reportShortcutused() を呼び出してください。 -
意味が変わっていないショートカットのみ更新を行う
動的ショートカットや固定ショートカットを変更する場合、意味が変わっていないショートカットの情報を変更する場合にのみ updateShortcuts() を呼び出してください。それ以外の場合は、再作成するショートカットの種類に応じて、次のいずれかの方法を使用する必要があります。
動的ショートカット:pushDynamicShortcut()。
ピンのショートカット: requestPinShortcut()。
たとえば、スーパーマーケットに移動するショートカットを作成した場合、スーパーマーケットの名前が変わっても場所が同じであれば、ショートカットを更新することが適切です。ただし、ユーザーが他のスーパーマーケットで買い物を始める場合は、新しいショートカットを作成することをお勧めします。
- アプリの公開時に動的ショートカットを確認する
ユーザーがデータを新しいデバイスに復元するときに、動的ショートカットは保持されません。したがって、「バックアップと復元」のコード スニペットに示されているように、アプリを起動するたびに getDynamicShortcuts() によって返されるオブジェクトの数を確認し、必要に応じて動的ショートカットを再公開することをお勧めします。
1.4 注意事項
-
各ショートカットは 1 つ以上のインテントを参照し、ユーザーがショートカットを選択すると、各インテントはアプリ内で特定のアクションを開始します。
Intent.ACTION_MAIN アクションと Intent.CATEGORY_LAUNCHER カテゴリを処理するメイン アクティビティのみがショートカットを持つことができます。アプリケーションに複数のメイン アクティビティがある場合は、アクティビティごとにショートカットのセットを定義する必要があります。 -
サポートされているほとんどのランチャーでは、静的ショートカットと動的ショートカットを含め、一度に最大 4 つのショートカットを表示できます。
デバイスでサポートされるショートカットの最大数はデバイスによって異なる場合があります。getMaxShortcutCountPerActivity() メソッドを使用して、特定のデバイスがサポートするショートカットの数を確認します。 -
ユーザーが作成できるアプリ固定ショートカットの数に制限はありません。アプリは固定されたショートカットを削除できませんが、無効にすることはできます。
他のアプリはショートカット内のメタデータにアクセスできませんが、ランチャー自体はアクセスできます。したがって、これらのメタデータは機密性の高いユーザー情報を隠す必要があります。
2. デスクトップウィジェット
2.1 概要
他のアプリ (ホーム画面など) に埋め込み、定期的に更新を受け取ることができるマイクロアプリ ビュー。これらのビューは UI ではウィジェットと呼ばれ、アプリ ウィジェット プロバイダーを使用してウィジェットを公開します。
他のアプリ ウィジェットをホストできるアプリ コンポーネントは、アプリ ウィジェットでホストされるアプリと呼ばれます。以下のスクリーンショットは、設定アプリのウィジェットを示しています。
2.2 デスクトップウィジェットの追加
これは比較的簡単なので、手順を見てみましょう。
- AppWidgetProvider を継承するクラスを作成する
public class SettingsAppWidgetProvider extends AppWidgetProvider {
}
- 新しいレイアウト ファイル widget.xml を作成します
- res フォルダーの下に新しい xml フォルダーを作成し、新しい appwidget_info.xml
ファイルを作成して AppWidgetProviderInfo リソースの場所を指定します。
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/loading_widget" 用于定义应用微件布局的布局资源
android:minHeight="@dimen/min_digital_widget_height" 指定应用微件默认情况下占用的最小空间
android:minWidth="@dimen/min_digital_widget_width" 指定应用微件默认情况下占用的最小空间
android:minResizeHeight="59dp" 指定应用微件的绝对最小大小
android:minResizeWidth="136dp" 指定应用微件的绝对最小大小
android:previewImage="@drawable/appwidget_digital_clock_preview" 指定预览来描绘应用微件经过配置后是什么样子的
android:resizeMode="horizontal|vertical" 按什么规则来调整微件的大小
android:configure="com.example.android.ExampleAppWidgetConfigure" 在用户添加应用微件时启动以便用户配置应用微件属性的 Activity
android:updatePeriodMillis="0" 刷新频率
android:widgetCategory="keyguard|home_screen" /> 应用微件是否可以显示在主屏幕 (home_screen) 和/或锁定屏幕 (keyguard) 上
- 登録用マニフェストファイル(AndroidManifest.xml)
<receiver android:name=".widget.SettingsAppWidgetProvider"
android:label="@string/gadget_title"
android:exported="false"
android:enabled="@bool/has_powercontrol_widget">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
<action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<action android:name="android.net.conn.BACKGROUND_DATA_SETTING_CHANGED" />
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
<action android:name="android.location.MODE_CHANGED" />
<action android:name="com.android.sync.SYNC_CONN_STATUS_CHANGED" />
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" />
</receiver>
プロジェクト内のコードは公開されませんので、ソースコードの設定、デスククロック、音楽など、学習用のソースコードを確認することをお勧めします。
別の公式デモをデモする