Сохранение данных при закрытии приложения и извлечение данных

Я знаю, есть много вопросов относительно сохранения/получения данных здесь. Я делал поиск вещей сам по себе и действительно думал, что смогу найти ответы, не задавая вопроса, но я начал задаваться вопросом, что я не видел ответа здесь.

МОЯ СИТУАЦИЯ:

Естественно, я делаю приложение. При закрытии приложения я хочу сохранить простой массив чисел (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;
    }
}