13

エントリポイントが「ログイン/スプラッシュ」 Activityであるアプリケーションがあり、サーバーから新しいデータをプリロードする必要があります。これSplashActivityは次のように宣言されます:

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

私のAndroidManifest.xmlでは、データがロードされた後、カスタムApplicationクラスにいくつかのデータを保持し、に進みます MainActivity

OSまたはユーザーによって(強制停止を使用してApplication)停止され、後でユーザーによって再起動された後、アプリケーションのエントリポイントがSplashActivity再び起動することを期待していますが、システムはをスキップしてSplashActivityを表示します。MainActivity

質問:これは予想される動作ですか?プロセス全体が停止した場合、アプリケーションを最初から開始するべきではありませんSplashActivityか?これは達成できますか?

4

2 に答える 2

28

実際、この質問とその回答のいくつかによって対処されるいくつかの問題があります。


元の質問に答えるために、「はい、これは予想される動作です」。

Androidは、各アクティビティを個別の自己完結型エンティティと見なします。Androidは、タスクスタック内のアクティビティの状態を記憶しており、必要なときにいつでもアクティビティを再構築できることを「認識」しているため、必要なときにいつでもプロセス(すべてのアクティビティを含む)を強制終了できます。もちろん、この概念は、アクティビティ間に依存関係がある複雑なアプリケーションがある場合や、Applicationクラス(または同様の静的/シングルトンの場所)に格納するグローバルデータがある場合に機能しなくなります。

Androidがプロセスを強制終了すると、タスクの最上位のアクティビティが記憶され、ユーザーがタスクに戻ると、プロセスが再作成されてから、タスクの最上位のアクティビティのみが再作成されます。あなたの場合、MainActivity

例として、タスクスタックが次のようになっている場合:

StartActivity -> ActivityB -> ActivityC -> ActivityD

そして、タスクはバックグラウンドに移動し、Androidはプロセスを強制終了します。ユーザーがタスクに戻ると、ActivityD再作成されるだけです。終了するとActivityD、Androidは再作成しActivityCます。完了ActivityCすると、Androidは再作成などを行います。つまり、ユーザーがタスクを再開しても、ActivityBスタック全体は再作成されません。

必要な動作を実現するマニフェスト設定またはインテントフラグの組み合わせはありません。Androidがそのようなものを提供してくれればいいのですが、現時点では提供していません。


アプリケーションから派生したクラス(または他のクラス)で静的(クラス)ブール変数を使用して、プロセスが再開されたかどうかを判断できます。この変数は、プロセスが再開されたときに常に値を持ち、falseその後、どこからでも変数の状態を確認し、必要に応じて再初期化(データの再ロード)できます。次に、変数をに設定しますtruetrueすべてのアクティビティが終了した場合でも、プロセスが強制終了されて再作成されるまで残ります。このようにして、必要な場合にのみ初期化できます。

これをインジケーターとして使用して、からアプリケーションを再起動することもできますSplashScreen。したがって、すべてのアクティビティで、でonCreate()、このブール変数の状態を確認できます。アプリケーションが再起動されている場合は、次のSplashScreenようにリダイレクトできます。

Intent intent = new Intent(this, SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

SplashScreenこれにより、タスク内のすべてのアクティビティが終了し、タスクのルートで再開されます。


次に、ユーザーがアプリケーションに戻るたびに(バックグラウンドでAndroidOSによって強制終了されたときに)データをダウンロードする必要がないようにする場合は、ダウンロードしたデータをプライベートキャッシュ領域に保存して使用する必要があります。アプリケーションが再起動されたとき。これにより、プロセスが強制終了されて再起動された場合にデータを繰り返しダウンロードする必要がなくなります。


これに対処する別の方法は、サービスにデータをロードすることです。プロセスで実行している場合Service、Androidがプロセスを強制終了する可能性は低くなります。Serviceユーザーがアプリケーションを使い終わったら、必ずシャットダウンする必要があります。


私はこの答えが長々と続くことを理解しています。うまくいけば、あなたはそれから何かを得ることができます。

于 2012-06-28T16:34:29.377 に答える
0

これは次のように実行できます。

1. SplashActivity毎回間違いなく開始します。

2.データをダウンロードし、ロードが以前に行われたことを示すチェック(ブール値)を保存します。SharedPreferencesを使用できます。

3.次回は状態を確認し、MainActivityすぐに開始します。

于 2012-06-28T10:57:35.953 に答える