Подтвердить что ты не робот

Что именно делает 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++;
}

}

Приведенный выше код отображает значение left-over в mValue, и оно увеличивается, когда сеанс заканчивается, поэтому я точно знаю, что вызывается onDestroy().

Я нашел полезный ответ на этом форуме, и я понимаю, что в приведенном выше коде mValue является членом класса, а не членом экземпляра. Но не правда ли, что в этом конкретном случае у меня есть только одна активность HelloAndroid, и поэтому, когда он умирает, все очищается, и в следующий раз, когда я вернусь, все начнется снова? (Или, есть ли какая-то другая посторонняя вещь в системе, которая все еще держится за ней после onDestroy(), так что она просто не умрет?)

(Выше всего это переменная, что, если это куча ссылок objec? Каждая часть - это отдельная перезаряжаемая память. Есть ли вероятность того, что GC собирает некоторые из них, но не все или нет? меня беспокоит.)

4b9b3361

Ответ 1

ОС решает, когда вещи "уходят". onDestroy позволяет вашему приложению иметь окончательный шанс очистить вещи до того, как активность будет уничтожена, но это не значит, что на самом деле активность будет GCed. Вот хорошая статья, которую я рекомендую людям читать, относящуюся к созданию кнопки выхода. Хотя это не совсем то, о чем вы просили, концепции помогут вам понять, что происходит.

Ответ 2

Однако у вас есть не просто активность. У вас также есть приложение, и его процесс работает в VM Dalvik. Android обычно оставляет приложение, работающее в фоновом режиме, до тех пор, пока ему не понадобится восстановить память, используемую для какого-либо другого приложения. Ваш статический член должен оставаться в памяти до тех пор, пока выполняется процесс. Если вы попытаетесь запустить какое-то приложение с интенсивным использованием памяти или принудительно закрыть запущенное приложение с помощью некоторого диспетчера задач, вы можете увидеть статическое значение reset.