Сохранение данных при закрытии приложения и извлечение данных
Я знаю, есть много вопросов относительно сохранения/получения данных здесь. Я делал поиск вещей сам по себе и действительно думал, что смогу найти ответы, не задавая вопроса, но я начал задаваться вопросом, что я не видел ответа здесь.
МОЯ СИТУАЦИЯ:
Естественно, я делаю приложение. При закрытии приложения я хочу сохранить простой массив чисел (0 или 1) или логических значений. После запуска приложения я хочу найти этот массив, если он существует, и получить его для использования в приложении.
Я начал помещать свой код в операцию, в которой будет использоваться массив. Но я начал задаваться вопросом, нужно ли мне копировать/вставлять переопределенную функцию onStop()
во все мои действия? Или я делаю это в основном действии и как-то связываю другие действия.
В принципе, независимо от того, какое состояние/активность приложение в настоящий момент включено, когда приложение закрыто, я хочу сохранить массив int/bool и открыть его обратно при запуске приложения.
Возможно, я не знал, как искать то, что я хотел, поэтому объяснение было правильным.
Я не против делать больше поисков, но если кто-то укажет на меня в правильном направлении, я буду очень благодарен.
EDIT: Если есть лучший способ сделать то, что я хочу, чем то, что я описал (например, используя другое состояние вместо onStop()
), пожалуйста, не стесняйтесь выкидывать идеи. Это мой первый раз, когда мне приходится иметь дело с жизненными циклами действий, и я немного смущен даже после изучения учебников по разработке Android. Я действительно думаю, что они плохо сделаны в большинстве случаев.
Ответы
Ответ 1
Когда приложение должно сохранять некоторые постоянные данные, вы всегда должны делать это в методе onPause()
, а не onStop()
. Поскольку, если ОС Android отключает ваш процесс, методы onStop()
и onDestroy()
никогда не вызываются. Аналогичным образом извлекают данные в метод onResume()
.
Ответ 2
Глядя на цель, которую вы хотите выполнить, SharedPreferences - это все, что вам нужно.
В документации указано:
"SharePreferences предоставляет общую структуру, которая позволяет вам сэкономить и извлекать постоянные пары ключ-значение примитивных типов данных. Вы может использовать SharedPreferences для сохранения любых примитивных данных: booleans, float, ints, longs и strings. Эти данные будут сохраняться у пользователя сессий (даже если ваше приложение убито).
Ответ 3
Используйте SharedPreference
для хранения небольшого объема данных или используйте SQLite
для хранения большого объема данных.
См. Эту ссылку
http://developer.android.com/guide/topics/data/data-storage.html
Ответ 4
Сериализовать объект и передать его, что более надежно, чем общие настройки (было много проблем с согласованностью с общими предпочтениями):
public class SharedVariables {
public static <S extends Serializable> void writeObject(
final Context context, String key, S serializableObject) {
ObjectOutputStream objectOut = null;
try {
FileOutputStream fileOut = context.getApplicationContext().openFileOutput(key, Activity.MODE_PRIVATE);
objectOut = new ObjectOutputStream(fileOut);
objectOut.writeObject(serializableObject);
fileOut.getFD().sync();
} catch (IOException e) {
Log.e("SharedVariable", e.getMessage(), e);
} finally {
if (objectOut != null) {
try {
objectOut.close();
} catch (IOException e) {
Log.e("SharedVariable", e.getMessage(), e);
}
}
}
}
Затем используйте класс для использования:
public class Timestamps implements Serializable {
private float timestampServer;
public float getTimestampServer() {
return timestampServer;
}
public void setTimestampServer(float timestampServer) {
this.timestampServer = timestampServer;
}
}
Затем везде, где вы хотите написать переменную, используйте:
SharedVariables.writeObject(getApplicationContext(), "Timestamps", timestampsData);
Ответ 5
Лучший способ добиться этого:
- создать класс. Назовите это MySettings или что вам подходит.
- в этом классе, определите массив ints/booleans, который вы собираетесь использовать, как статический. Создайте метод getter и setter (свойство) для доступа к нему (также как статические методы).
- добавьте метод static load() в MySettings, который читает из SharedPreferences. Когда вы запускаете приложение (в своем первом действии или лучше в подклассе приложения), вызовите
MySettings.load()
. Этот метод загрузки устанавливает массив
- добавить статический метод
save()
. Общественность также. Теперь вы можете сэкономить в любом месте приложения. Этот метод save()
считывает массив и записывает его в SharedPreferences
Пример кода:
public class MySettings {
private static List<Integer> data;
public static void load() {
data = new ArrayList<Integer>();
// use SharedPreferences to retrieve all your data
}
public static void save() {
// save all contents from data
}
public static List<Integer> getData() {
return data;
}
public static void setData(List<Integer> data) {
MySettings.data = data;
}
}