LoginSignup
20
14

More than 3 years have passed since last update.

Androidでパッケージマネージャーから起動した場合二重起動してしまった

Last updated at Posted at 2017-11-10

Androidで

  • A.ホームからアプリアイコンから起動した場合
  • B.アプリをブラウザでダウンロードしインストール後のパッケージマネージャーアプリから起動した場合

の2つの起動方法で動作が異なり、ネットを彷徨い続けたのでメモ。

具体的にはスプラッシュ画面を実装しているのだが、

  • Aで起動 → スプラッシュが終了 → ホームボタン → Aで起動 → 前回終了画面
  • Bで起動 → スプラッシュが終了 → ホームボタン → Aで起動 → スプラッシュ画面が起動

なぜか、インストールを行ったパッケージマネージャーでそのまま、開くを押して起動した場合に前回終了画面から再開してくれない。

一応 android:launchMode="singleTask" にすれば、動作の違いは解消しますが、
前回終了画面から再開してほしい・・・

この現象調べまくっていると、
https://groups.google.com/forum/#!topic/android-group-japan/xTkgh24lnRc
全く同じ現象をやりとりしていて、これだ!と思ったのですが、
android:launchMode="singleTask"
にするとの回答しかありませんでした。

Launcher Activity に android:launchMode="singleTask"を設定すると、
既に起動されているTaskが使用されますが、最後に表示していたActivity
が表示される保障があるわけではなく、Launcher Activityが最前面になり
ますよね?

中にこのような質問があり、そう!そうなんですよ!と思いましたが、それの回答は見当たらず・・・

最終的に以下サイトに行き着きました。
http://d.hatena.ne.jp/kk_Ataka/20130804/1375624170

ブラウザからinstallして起動したときと、ランチャーから起動した時では、
起動するときのIntentが微妙に異なります。
その為、ランチャーから起動した場合の、「既に起動していたら二重起動しない」という
仕組みが動作しません。
二重起動されたActivityでは、起動IntentにFLAG_ACTIVITY_BROUGHT_TO_FRONTがセットされるようなので、

SplashActivity.java
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
    finish();
    return;
  }
}

のようにすると、所望の動作になると思います。

上記の修正をそのまま対応して解決。

20
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
14