web-dev-qa-db-ja.com

onDestroy()は正確に何を破壊しますか?

この「特性」に悩まされてきました。[戻る]ボタンを使用してアプリを終了すると、onDestroy()が呼び出されたことがわかりますが、次回アプリを実行したときに、Activityクラスのすべての静的メンバーが値。以下のコードを参照してください。

public class HelloAndroid extends Activity {

private static int mValue;   // a static member here

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView tv = new TextView(this);
    tv.setText((mValue != 0) ? 
        ("Left-over value = " + mValue) : "This is a new instance");
    setContentView(tv);
}

public void onDestroy() {
    super.onDestroy();
    mValue++;
}

}

上記のコードは、mValueに残った値を表示し、セッションが終了するとインクリメントされるため、onDestroy()が確実に呼び出されることがわかります。

このフォーラムで 便利な回答 を見つけました。上記のコードでmValueがインスタンスメンバーではなくクラスメンバーであることを理解しています。しかし、この特定のケースでは、HelloAndroidアクティビティが1つしかないため、彼が死んだときにすべてがクリーンアップされ、次に戻ってきたときにすべてが最初からやり直されるのは本当ではないでしょうか。 (または、システムに他のいくつかの不可思議な事柄がonDestroy()の後でまだ保持されているため、死なないだけですか???)

(上記は単なる変数です。objec参照の束である場合はどうなりますか?各ピースは個別に再収集可能なメモリです。GCがそれらの一部を収集する可能性はありますが、オールオアナローではありませんか?これは本当に私を悩ませます。 )

29
wwyt

OSは、「いつなくなるか」を決定します。 onDestroyは、アクティビティが破棄される前にクリーンアップするための最終的なチャンスをアプリに与えるためのものですが、それは意味しませんアクティビティは実際にはGCされます。これは 良い記事 です。終了ボタンの作成に関連することをお勧めします。それは正確にはあなたが尋ねたことではありませんが、概念は何が起こっているかを理解するのに役立ちます。

35
Andrew White

ただし、アクティビティだけではありません。また、アプリケーションとそのプロセスがDalvik VMで実行されています。 Androidは通常、他のアプリケーションで使用しているメモリを再利用する必要があるまで、アプリケーションをバックグラウンドで実行したままにします。静的メンバーは、プロセスが実行されている限りメモリに残っている必要があります。メモリを大量に消費するアプリケーションを実行したり、実行中のアプリケーションをタスクマネージャーで強制終了したりすると、静的な値がリセットされることがあります。

9
Jems