class MySettings {
// final can't be changed
public static final String CONSTANT = "ucantchangeme";
// static - all Objects have just these - even different Acitivities etc
public static String sUserName;
// class instance members - each Object you create with new has its own version
public String mUserName;
public MySettings() {
mUserName = "uninitialized";
}
public static void init() {
sUserName = "Peter";
}
public static void reset() {
sUserName = null;
}
}
/* Your Activity */
class MyActivity extends Actitivy {
private MySettings mSettings;
private MySettings mOtherSettings;
onCreate() {
// init those static parts of MySettings
MySettings.init();
mSettings = new mSettings();
mSettings.mUserName = "Peter"
Log.d("TAG", "Username: " + mSettings.mUserName);
// prints Peter
// this could also be another Activity
mOtherSettings = new MySettings();
Log.d("TAG", "Username: " + mOtherSettings.mUserName);
// prints "uninitialized"
MySettings.sUserName = "Jim";
Log.d("TAG", "Username: " + MySettings.sUserName);
// prints "Jim"
mSettings.sUserName = "Joe";
Log.d("TAG", "Username: " + MySettings.sUserName);
Log.d("TAG", "Username: " + mSettings.sUserName);
Log.d("TAG", "Username: " + mOtherSettings.sUserName);
// all print "Joe" now
}
onDestroy() {
// clear MySettings
MySettings.reset();
}
}
Вы можете сбросить статические переменные на null
или любое другое значение, которое вы хотите, но использование статических переменных для других вещей, кроме констант, обычно является плохой идеей - обычно это плохой дизайн класса и может привести к неожиданному поведению, подобному тому, которое вы наблюдали.
Значение статических переменных будет сохраняться до тех пор, пока класс загружен - это почти не имеет отношения к жизненному циклу Activity (onCreate
, ..., onDestroy
)
При первом обращении к классу из кода он будет загружен, а затем он не исчезнет, пока не появится причина для его выгрузки. В течение этого времени все, что находится в вашем приложении (технически в одном и том же процессе - обычно каждый .apk использует свое собственное), будет считывать одно и то же значение из этой статики. И если вы меняете его из разных мест, вы меняете его для других частей, которые не знают об этом изменении - вот почему это плохо:)
Единственная причина (я знаю), что Android будет выгружать класс, состоит в том, что ваше приложение полностью удаляется из памяти - либо через убийцу задач, либо когда ваше приложение перестает быть активным и память становится мало. Это полностью вне вашего контроля и не должно происходить во время использования вашего приложения. Это может произойти, если, например, приходит телефонный звонок, и ваше приложение возобновляется позже.