Лучший способ сохранить внутренние данные?

Дело в том, что когда я начал изучать разработку для Android, я думал, что буду хранить свои внутренние данные в общедоступных статических переменных в выделенном классе, только для этой цели, чтобы я мог легко получить к ним доступ из любого действия, и это было и до сих пор очень важно, чтобы не было дубликатов, и эти значения всегда уникальны, что-то вроде модели Singleton. Это работает потрясающе, хотя это не самое красивое решение. Проблема начинается, когда пользователь переводит приложение в фоновый режим с помощью кнопки «Домой». Он остается там черт знает сколько времени, может, минут, может, дней, а то и больше... потом он снова открывает приложение, и все эти статические переменные становятся нулевыми, так как система их уже уничтожила. Некоторые из этих переменных являются простыми строками, а некоторые — довольно сложными собственными классами.

Первый вопрос: есть ли какой-то глобальный хук, на который я могу положиться, где я могу сохранить эти данные, когда приложение переходит в фоновый режим? Поэтому, когда пользователь снова выводит приложение на передний план, я могу просто повторно инициализировать эти переменные из сохраненного состояния.

Второй вопрос: как лучше всего сохранить эти сложные данные? Насколько я понимаю, для сохранения Strings SharedPreferences вполне подойдет, а как быть с более сложными классами? Могу ли я использовать SharedPreferences, или я должен использовать что-то еще?

На данный момент это все, что я могу придумать, заранее спасибо за помощь!


person hundeva    schedule 05.10.2012    source источник


Ответы (4)


Плохая идея со всеми статическими переменными в классе. Игнорируя весь фиаско с глобальными переменными, они не сохраняются. Вы должны использовать SharedPreferences или базу данных, если вам нужно сохранить данные.

person toadzky    schedule 05.10.2012

Что касается вашего первого вопроса, я считаю, что вы ищете что-то похожее на метод onResume() в жизненном цикле активности.

На ваш вопрос о хранилище вам доступен sqlLite.

person withoutclass    schedule 05.10.2012

В этом документе описаны все варианты хранения данных на Android. SharedPreferences отлично подходят для простых типов, но, похоже, вам лучше использовать одну или несколько базы данных SQLite.

person Phil    schedule 05.10.2012

Вам определенно нужно использовать общие настройки, и это самый простой пример для этого:

//Create a new class

public class PizzaApplication extends Application {

private static String sharedPreferences = "Pizza";
private static Context context;

@Override
public void onCreate (){
    super.onCreate();
    context = this;
}

public static void saveString(Context context, String key, String value) {
    SharedPreferences sharedPref = context.getSharedPreferences(sharedPreferences,Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString(key, value);
    editor.commit();
}

public static String getString(Context context, String pKey) {
    SharedPreferences sharedPref = context.getSharedPreferences(sharedPreferences,Context.MODE_PRIVATE);
    return sharedPref.getString(pKey, null);
}
}

//FROM ACTIVITY
//Save string

PizzaApplication.saveString(getApplicationContext(), "country", "test");

//Receive it 

String testString = PizzaApplication.getString(getApplicationContext(), "country"); //returns "test"
person Giedrius Šlikas    schedule 03.07.2017