実際、この質問とその回答のいくつかによって対処されるいくつかの問題があります。
元の質問に答えるために、「はい、これは予想される動作です」。
Androidは、各アクティビティを個別の自己完結型エンティティと見なします。Androidは、タスクスタック内のアクティビティの状態を記憶しており、必要なときにいつでもアクティビティを再構築できることを「認識」しているため、必要なときにいつでもプロセス(すべてのアクティビティを含む)を強制終了できます。もちろん、この概念は、アクティビティ間に依存関係がある複雑なアプリケーションがある場合や、Application
クラス(または同様の静的/シングルトンの場所)に格納するグローバルデータがある場合に機能しなくなります。
Androidがプロセスを強制終了すると、タスクの最上位のアクティビティが記憶され、ユーザーがタスクに戻ると、プロセスが再作成されてから、タスクの最上位のアクティビティのみが再作成されます。あなたの場合、MainActivity
。
例として、タスクスタックが次のようになっている場合:
StartActivity -> ActivityB -> ActivityC -> ActivityD
そして、タスクはバックグラウンドに移動し、Androidはプロセスを強制終了します。ユーザーがタスクに戻ると、ActivityD
再作成されるだけです。終了するとActivityD
、Androidは再作成しActivityC
ます。完了ActivityC
すると、Androidは再作成などを行います。つまり、ユーザーがタスクを再開しても、ActivityB
スタック全体は再作成されません。
必要な動作を実現するマニフェスト設定またはインテントフラグの組み合わせはありません。Androidがそのようなものを提供してくれればいいのですが、現時点では提供していません。
アプリケーションから派生したクラス(または他のクラス)で静的(クラス)ブール変数を使用して、プロセスが再開されたかどうかを判断できます。この変数は、プロセスが再開されたときに常に値を持ち、false
その後、どこからでも変数の状態を確認し、必要に応じて再初期化(データの再ロード)できます。次に、変数をに設定しますtrue
。true
すべてのアクティビティが終了した場合でも、プロセスが強制終了されて再作成されるまで残ります。このようにして、必要な場合にのみ初期化できます。
これをインジケーターとして使用して、からアプリケーションを再起動することもできますSplashScreen
。したがって、すべてのアクティビティで、でonCreate()
、このブール変数の状態を確認できます。アプリケーションが再起動されている場合は、次のSplashScreen
ようにリダイレクトできます。
Intent intent = new Intent(this, SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
SplashScreen
これにより、タスク内のすべてのアクティビティが終了し、タスクのルートで再開されます。
次に、ユーザーがアプリケーションに戻るたびに(バックグラウンドでAndroidOSによって強制終了されたときに)データをダウンロードする必要がないようにする場合は、ダウンロードしたデータをプライベートキャッシュ領域に保存して使用する必要があります。アプリケーションが再起動されたとき。これにより、プロセスが強制終了されて再起動された場合にデータを繰り返しダウンロードする必要がなくなります。
これに対処する別の方法は、サービスにデータをロードすることです。プロセスで実行している場合Service
、Androidがプロセスを強制終了する可能性は低くなります。Service
ユーザーがアプリケーションを使い終わったら、必ずシャットダウンする必要があります。
私はこの答えが長々と続くことを理解しています。うまくいけば、あなたはそれから何かを得ることができます。