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がセットされるようなので、
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
finish();
return;
}
}
のようにすると、所望の動作になると思います。
上記の修正をそのまま対応して解決。