Android
Firebase
DynamicLink

DynamicLinkで起動された画面が「最近使ったアプリ」に残らない

注意

この情報は、2017/12/26現在のものです。
最新情報はこちらでご確認下さい。
https://firebase.google.com/support/releases

現象

  • Dynamic Linkで起動された画面がRecentAppsに残らない
    • 起動した画面で直接履歴ボタンを押した場合、OS5は自アプリがいない状態。OS6以降は存在はする
    • 起動した画面でホームボタン押下後やスリープ復帰後、履歴ボタンを押すと、自アプリがいない(OS5~全て共通)
  • アプリをランチャーアイコンから再起動しても残らないまま
  • アプリを設定アプリなどで「強制停止」させた後、再び残るようになる

調べたこと

「アプリ履歴に残さないフラグ」でも付いてんじゃね?
と思って、下記ログを仕込んでみた。

MainActivity.java
FirebaseDynamicLinks.getInstance()
      .getDynamicLink(getIntent())
      .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
        @Override
        public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
          // Get deep link from result (may be null if no link is found)
          Uri deepLink = null;
          if (pendingDynamicLinkData != null) {
            deepLink = pendingDynamicLinkData.getLink();
          }
          if (deepLink == null) return;

          // Intentフラグを確認するログ
          Intent intent = getIntent();
          if (0 != (intent.getFlags() & Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)) {
            Log.d("DynamicSample", "intent has Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS");
          }
          Log.d("DynamicSample", "getDynamicLink:onSuccess");
          // Handle the deep link. For example, open the linked
          // content, or apply promotional credit to the user's
          // account.
          // ...
          Log.d("DynamicSample", "getDynamicLink:url= " + deepLink.toString());

          // ...
        }
      })
      .addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
          Log.d("DynamicSample", "getDynamicLink:onFailure");
          e.printStackTrace();
        }
      });

起動はadbコマンドから。

$ adb shell am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d <DYNAMIC_URL>

で、出てきたLogcat.

D/DynamicSample: intent has Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

ビンゴ!

バグなの?仕様なの?

というのは私には分からないので、Firebaseに問い合わせ。
結論。

仕様です。

ということだそうです。

※もしかしたら、adbコマンドで起動しているせいだよ、って言われるかと期待していたのですが、仕様、との回答だったので、adbコマンドで無くても、このフラグを付ける処理がFirebaseのSDK自体に入っているのではと思います。

対処

アプリを強制停止しないかぎり、ずっと残らないままになるのは困るし、ってことで、以下の対応をしました。

  • Dynamic Linkを受け取って対象画面を起動するとき、別プロセスで起動する
    具体的には、Intent.FLAG_ACTIVITY_NEW_DOCUMENTを付けてやった感じです。

  • Dynamic Linkで起動された画面は、finishAndRemoveTask()で終了する

ただ、微妙にOS5と、OS7で挙動が違ったり、一瞬、「最近使ったアプリ」に2つ自アプリが存在したり、いろいろとまだしっくりこない点はありますが、「ずっと残らない」よりはマシだろう、と判断して入れています。