2012-01-04 12 views
3

予期しないことに、アプリケーションの終了後に静的なクラスメンバーが保持されていることがわかりました (onDestroy()が呼び出された後)。 静的メンバーの初期化は、次のアプリケーションのインスタンス生成では無視されます。 これは正常なのでしょうか、それともエミュレータのバグだけですか? ドキュメントでそれについて何も見つかりません。彼らはこの行動に関係する何かを指定していますか?アプリケーションが破棄されたときに静的メンバー値が保持されるのは普通ですか?

追加コメント:私はこのような活動、静的および非静的に2つのフィールドを持っている場合は は:

static String s1 = new String("s1"); 
String s2 = new String("s2"); 

を...と破壊し、再度アプリケーションを起動し、最初の初期化が実行されず、2つ目実行される。センスはどこですか?私にとっては、それは言語のルールに違反します。

答えて

0

アプリケーションが起動すると、自身のVMが起動し、メインアクティビティが開始されます。そのアクティビティが残っているとき(例えば、戻るボタンが押されたとき、またはfinish()を呼び出したとき)onDestroy()が実行されます。

技術的にはアプリケーションが終了しても、アプリケーションプロセスとVMはまだ動作しています。これにはスレッドの実行も含まれます。

したがって、すべての静的メンバーは元のままです。システムが表示されていないときにいつでもメモリを必要とすると、システムはVMを強制終了できます。

+0

だから、静的メンバーの初期化は役に立たず、変更可能なものはすべてコードの先頭に割り当てる必要があることがわかります。 – ardabro

+0

@ardabro静的属性は無駄ではありませんが、意図した特定の目的に使用する必要があります。それらは定数を格納するためにJavaアプリケーションでよく使われます(しばしば 'final'キーワードを使って不変であることが強制されます)。クラスのインスタンス間で値が共通で一貫性があるなど、他のシナリオでも役に立ちます。 – Atonewell

+0

間違いなく、Androidアプリのライフサイクルは、起動/停止がより明示的に制御される典型的なJavaアプリとは異なります。 –

2

onDestroyは、アプリケーションのプロセスが強制終了されているか、クラス自体が破壊/アンロードされたことを意味するものではなく、アクティビティを破棄していますインスタンス

+1

答えはなんですか?告発はより新しい殺されていますか?永遠に生きる? – ardabro

+1

答えは、onDestroyに関するあなたの前提が間違っていることを意味し、間違った質問をしています。アプリが完全に削除されたとき(強制停止など)実際に尋ねていますか? –

+0

ところで、アプリケーションの再起動時に、アクティビティの非静的メンバーのイニシャライザが再度実行されることを考慮して、新しいアクティビティクラスのインスタンスが構築されていることを確認します。アプリケーションは凍結されていません。静的メンバーだけが保持されます。 – ardabro

関連する問題