2012-01-28 13 views
0

アプリをバックグラウンドに入れた後、アクティビティに再開すると、別のアクティビティで設定された静的クラス変数がガベージコレクタによってリセットされ、値がゼロに設定されている可能性がありますか?Androidアプリの再開時にグローバル変数の値がリセットされましたか?

私は主なアクティビティでいくつかのpublic static int変数を使用し、それらをさまざまな他のアクティビティでグローバル変数として使用します。私はAndroidマーケットのデベロッパーコンソールでクラッシュレポートを受け取りました。ここで唯一の説明は、別のクラスのpublic static int変数の値を使用するアクティビティに再開するというものですが、その値は(不思議なことに?)ゼロになる。私はアプリが最初に始まったときに何かに設定されていたことを知っています。これはすべて可能ですか?

私の疑惑が正しければ、アプリケーションをバックグラウンドに置いたときにグローバル変数の値を保持するために推奨される方法は何ですか? OnPause()のSharedPreferencesに保存するか、onSaveInstanceStateなどを使用しますか?

答えて

4

アプリをバックグラウンドに入れた後、アクティビティに再開すると、別のアクティビティで設定された静的クラス変数がガベージコレクタによってリセットされ、値がゼロに設定されている可能性がありますか?

"ガベージコレクタによってリセットされません"。しかし、このプロセスは、他のアプリケーション用にメモリを解放するために、Androidによって終了されている可能性があります。

アプリをバックグラウンドに置いたときにグローバル変数の値を保存するには、どのような方法が推奨されますか?

スタティックデータメンバーはキャッシュでなければなりません。何が起きても保持したいデータ(プロセスが終了するなど)は、フラットファイルSharedPreferences、またはデータベースなどの永続ストアに保存する必要があります。 onPause()は、そのデータを保持するための準備ができている可能性が高い時間です。その後もいつでもプロセスは予告なく終了する可能性があります。

+0

私はプロセスがシステムによって終了できることを知っています。それは問題ではありません。問題は、主なアクティビティではないアクティビティにアプリが再開したときです。 – Anders

+0

@アンダー:ユーザーが最近のタスクでアプリケーションを起動した場合、制御はユーザーが最後に行ったアクティビティに戻ります。 – CommonsWare

+1

スタックトレースからは、システムのJavaファイルのみが表示されます。 。これは、アプリがバックグラウンドから再開したときにクラッシュが発生したと思う。私の主なアクティビティにはないスピナーに値が設定されているとクラッシュするようです。スピナーで使用されるArrayListのサイズは、メイン以外のアクティビティでonCreateで作成され、メインアクティビティ内のグローバル変数からそのサイズを使用します。その値はゼロだったようです。 – Anders

0

この値は、アクティビティのonDestroyメソッドまたはexitへの応答のある別のメソッドでSQLiteに保存できます(この状態では、状態を維持するために静的変数が使用されます)。

関連する問題