Help us understand the problem. What is going on with this article?

AppShortcutsでNavigation Drawerを持ったActivityを起動するときの実装方法

More than 3 years have passed since last update.

今回、私の開発しているKyudoScoreBookでAppShortcutsを実装しました。
KyudoScoreBookはGooglePlayStoreのようにNavigation Drawerを使っています。
Navigation Drawerから遷移できる基本機能の画面には、Navigation Drawerのメニューが選択された状態で表示するため、各画面はFragmentで切り替える実装を行っています。

AppShortcutsで実現したいこと

AppShortcutsでは、Navigation Drawerのメニューに表示されている、記録、メモ一覧、グラフ、占いの4つのメニューを実装することにしました。
先程述べたように、記録のショートカットから起動された場合は、Navigation Drawerの記録が選択状態で起動してほしいです。
また、各画面は同じActivityで複数Fragmentを切り替える実装になっているので、AppShortcutsから起動するときは同じAcitivityを起動する必要があります。
App ShortCutsの説明やgooglesamples/android-AppShortcutsには1つのショートカットのサンプルコードしかなく、困りました。

Static ShortcutsのintentにExtraを詰め込む

AppShortcutsから同じActivityを起動し、異なるFragmentを表示させたいので、intentにExtraを詰め込んで起動する必要があります。
その場合以下のように<intent>タグで<extra>タグを囲みます。

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
  <shortcut
      android:enabled="true"
      android:icon="@drawable/ic_short_record"
      android:shortcutId="shortcut_record"
      android:shortcutLongLabel="@string/shortcut_record"
      android:shortcutShortLabel="@string/shortcut_record">
    <intent
        android:action="android.intent.action.VIEW"
        android:targetClass="com.bowyer.app.appshortcuts.ui.activity.MainActivity"
        android:targetPackage="com.bowyer.app.appshortcuts">
      <extra
          android:name="shortcut_id"
          android:value="RecordTabFragment"/>
    </intent>
    <categories android:name="android.shortcut.conversation"/>

  </shortcut>
  <shortcut
      android:enabled="true"
      android:icon="@drawable/ic_short_memo"
      android:shortcutId="shortcut_memos"
      android:shortcutLongLabel="@string/shortcut_memo_list"
      android:shortcutShortLabel="@string/shortcut_memo_list">
    <intent
        android:action="android.intent.action.VIEW"
        android:targetClass="com.bowyer.app.appshortcuts.ui.activity.MainActivity"
        android:targetPackage="com.bowyer.app.appshortcuts">
      <extra
          android:name="shortcut_id"
          android:value="MemoListFragment"/>
    </intent>

    <categories android:name="android.shortcut.conversation"/>
  </shortcut>
</shortcuts>

どのAppShortcutsから起動されたかハンドリングする

AppShortcutsから起動したMainActivity側では、intentからshortcut_idのExtraを取得します。
私の場合、通常起動もMainActivityを使用するので、shortcut_idが存在しているかチェックしています。

private static final String KEY_SHORTCUT_ID = "shortcut_id";
・・・
private void handleShortcutsAction() {
    boolean hasExtra = getIntent().hasExtra(KEY_SHORTCUT_ID);
    if (!hasExtra) {
      return;
    }
    String shortcutId = getIntent().getStringExtra(KEY_SHORTCUT_ID);
・・・

あとはこのshortcutIdに応じた処理を記載します。

    String shortcutId = getIntent().getStringExtra(KEY_SHORTCUT_ID);
    // 取得したshortcutIdからどのFragmentを起動するか決める
    Page page = Page.forMenuId(shortcutId);
    switch (page.getMenuId()) {
      case R.id.nav_record:
        pageChange(RecordTabFragment.newInstance());
        break;
      case R.id.nav_memo:
        pageChange(MemoListFragment.newInstance());
        break;
      case R.id.nav_chart:
        pageChange(ChartFragment.newInstance());
        break;
      case R.id.nav_notification:
        pageChange(NotificationFragment.newInstance());
        break;
      case R.id.nav_fortune:
        pageChange(FortuneFragment.newInstance());
        break;
    }
    // Navigation Drawerを選択状態にする
    navigationView.setCheckedItem(page.getMenuId());

GooglePlayStoreのようにNavigation Drawerで複数のFragmentを切り替えて使うようなアプリで、AppShortcutsを実装する場合は、参考にしてみてください。

AppShortcutsのサンプルコード

今回リリースしたアプリの一部コードを切り出したものを公開してます。KyudoScoreAppShortcuts

このサンプルコードを提供してすぐはStatic ShortcutsのintentにExtraを詰め込む方法が分からなかったので、Dynamic Shortcutsを使って複数のIntentを作成するイケてない実装でした。
そのDynamic ShortcutsからStatic Shortcutsに実装をやり直したPRもありますので、よければ参考にしてください。
Use static shortcuts with bundle extras

最後に

AppShortcutsはまだ情報が少なく、躓くことは多々あります。
私の公開したAppShortcutsのサンプルコードも、実装的にイケてない部分があります。
もしAppShortcutsのサンプルコードを見て、もっとこうした方が良いとかありましたらPRお願いします。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away