29

私はこの「特性」に悩まされてきました: 戻るボタンを使用してアプリを終了すると、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() の後にまだそれを保持していて、それが死なないようにしている他の不思議なものがありますか???)

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

4

2 に答える 2

35

OS は、物事がいつ「なくなる」かを決定します。これonDestroyは、アクティビティが破棄される前にアプリがクリーンアップする最後の機会を与えるためにありますが、実際にアクティビティが GC されることを意味するものではありません。これは、終了ボタンの作成に関連する、人々に読むことをお勧めする良い記事です。ご質問の内容とは正確には異なりますが、概念は何が起こっているのかを理解するのに役立ちます。

于 2011-02-13T01:50:39.013 に答える
9

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

于 2011-02-13T01:52:30.137 に答える