28

ドキュメントによると、Android OS はバックスタックの後部でアクティビティを強制終了できます。

たとえば、アプリがあり、メイン アクティビティ (アクティビティ A と呼びましょう) を開いたとします。この public アクティビティ クラスでは、public static 変数 ("foo" と呼びましょう) を宣言して初期化します。アクティビティ A の onCreate() メソッドで、「foo」の値を変更します。アクティビティ A から、ユーザーはアプリ内でアクティビティ B という別のアクティビティを開始します。変数「foo」はアクティビティ B で使用されます。ユーザーが他のアプリの他のアクティビティに移動した後、アクティビティ B は一時停止します。最終的に、メモリ不足が発生した後、アクティビティ A、次にアクティビティ B が強制終了される可能性があります。ユーザーがアプリに戻った後、アクティビティ B を再起動 (実際には「再作成」) します。

何が起こるのですか:

  1. この時点での変数「foo」には、アクティビティ A の onCreate() メソッドが実行されたときに設定された値が含まれますか?

  2. 変数「foo」が存在しませんか?

  3. 変数「foo」は存在しますが、現在は初期化された値であり、アクティビティ A の onCreate() メソッドで設定された値ではありませんか?

4

3 に答える 3

28

プロセスが強制終了されると、すべての静的変数がデフォルト値に再初期化されます。

したがって、アクティビティ A で設定した値は保持されません

于 2012-08-30T03:36:43.040 に答える
10

ここで 2:50 から良い説明を見ることができます http://www.infoq.com/presentations/Android-Design

この問題を手動でテストする場合の手順を次に示します。Android v.4 エミュレーターを作成し、[設定] -> [開発者設定] -> [バックグラウンド タスクを無効にする] に移動します。次に、2 つのアクティビティを含むサンプル android プロジェクトを作成し、アクティビティ A で静的変数を宣言し、onCreate() メソッドで初期化します。アクティビティ B を開始するボタンをアクティビティ A に配置します。アクティビティ B の onCreate() メソッドで、A.staticVar の値を logcat に出力します。

プロジェクトを起動します - アクティビティ A が表示されます。ボタンを押すと、アクティビティ B が表示され、静的変数の値が logcat に出力されます。ホーム ボタンを押して、他のプログラムを起動します。サンプル プロジェクト プロセスは強制終了されます (バックグラウンド プロセスが無効になっているため)。ホームボタンを長押しすると、最近起動したプログラムのリストが表示されます。サンプル プロジェクトを選択します。OS は、プロジェクトのアクティビティをバックスタックに復元し、最後に実行されたアクティビティ B を再作成しようとします。しかし、このステップでは、A.staticVar が null になるため NullPointerException でプログラムがクラッシュし、logcat に出力しようとしています。

于 2012-12-25T21:26:47.150 に答える
7

答えは(3)です。値を保持する必要がある場合は、各アクティビティが一時停止したときに共有設定に保持し、再開時に復元します。または、「初期化された」静的フラグを維持し、onCreate()false の場合はアクティビティのメソッドから静的変数を再初期化することもできます。

于 2012-08-30T03:39:18.847 に答える