web-dev-qa-db-ja.com

パブリック静的変数とAndroidアクティビティライフサイクル管理

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

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

何が起こるのですか:

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

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

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

26
jsstp24n5

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

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

27
nandeesh

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

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

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

10
agamov

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

7
Ted Hopp